You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 01:35:26