Jackson反序列化日期时如何忽略时间或将时间设为0?
解决Jackson反序列化日期出现非预期时间的问题
问题背景
JSON输入数据
[ { "Date": "2022-04-06T00:00:00" }, { "Date": "2022-12-06T00:00:00" } ]
POJO定义
@Data public class MyPojo { @JsonProperty("Date") @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd") private Date date; }
反序列化代码
public <T> List<T> toObjList(String json, Class<T> className) { try { return new ObjectMapper().readValue(json, objectMapper.getTypeFactory().constructCollectionType(List.class, className)); } catch (Exception ex) { log.error("Exception converting json to Object: {}", json); throw new AppException("Exception while converting String to Object list", ex, HttpStatus.INTERNAL_SERVER_ERROR); } }
异常现象
反序列化后打印Date对象,出现非预期的时间偏移:
(date=Fri Sep 30 05:30:00 IST 2022)
但使用SimpleDateFormat按yyyy-MM-dd解析同格式字符串时,输出符合预期:
Fri Sep 30 00:00:00 IST 2022
解决方案
1. 为@JsonFormat指定时区
Jackson默认使用系统时区解析日期,导致时区偏移。显式指定UTC时区即可修正:
@JsonProperty("Date") @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "UTC") private Date date;
这样Jackson会将JSON中的日期字符串按UTC时区解析为0点的Date对象,消除时区带来的时间偏差。
2. 全局配置ObjectMapper时区
若需统一处理所有日期字段,可全局设置ObjectMapper的时区为UTC:
ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setTimeZone(TimeZone.getTimeZone("UTC")); // 执行反序列化操作
所有日期类型的反序列化都会遵循UTC时区,确保时间部分为0点。
3. 改用LocalDate类型(推荐)
java.util.Date本身包含时间和时区信息,若业务仅需日期,建议使用Java 8+的java.time.LocalDate,它仅表示日期,无时间和时区概念:
@Data public class MyPojo { @JsonProperty("Date") @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd") private LocalDate date; }
需引入Jackson对Java 8时间类型的支持依赖:
<!-- Maven依赖 --> <dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> <version>匹配你的Jackson版本</version> </dependency>
并在ObjectMapper中注册对应模块:
ObjectMapper objectMapper = new ObjectMapper(); objectMapper.registerModule(new JavaTimeModule());
使用LocalDate能从根源上避免时间部分的问题,因为它本身不包含时间信息。
内容的提问来源于stack exchange,提问作者Arun Gowda
相关产品推荐
相关产品推荐

