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

测试中ObjectMapper反序列化dd.MM.yyyy HH:mm:ss为OffsetDateTime失败

问题根源

你遇到的报错核心原因是:OffsetDateTime必须包含时区偏移信息,但JSON返回的时间字符串(如18.04.2023 10:33:44)里没有时区,Java无法凭空生成ZoneOffset,因此直接解析会失败。

解决方案

以下三种方法都能解决这个问题,按需选择:

方案1:修复自定义反序列化器

先将字符串解析为不带时区的LocalDateTime,再指定业务需要的时区转换为OffsetDateTime:

private class CustomDeserializer extends JsonDeserializer<OffsetDateTime> {

    private DateTimeFormatter formatter;
    // 可根据业务场景指定固定时区,比如UTC、Europe/Moscow,或用系统默认时区ZoneId.systemDefault()
    private final ZoneId targetZone = ZoneId.of("UTC");

    public CustomDeserializer(DateTimeFormatter formatter) {
        this.formatter = formatter;
    }

    @Override
    public OffsetDateTime deserialize(JsonParser parser, DeserializationContext context) throws IOException {
        String dateStr = parser.getText();
        // 先解析为LocalDateTime(不带时区)
        LocalDateTime localDateTime = LocalDateTime.parse(dateStr, formatter);
        // 指定时区转换为OffsetDateTime
        return localDateTime.atZone(targetZone).toOffsetDateTime();
    }
}

方案2:用@JsonFormat注解指定时区

直接在POJO的createDate字段上添加带时区的注解,无需自定义反序列化器:

// 示例:指定为UTC时区,可替换为业务实际需要的时区(如"Europe/Moscow")
@JsonFormat(pattern = "dd.MM.yyyy HH:mm:ss", timezone = "UTC")
private OffsetDateTime createDate;

同时确保ObjectMapper注册了JavaTimeModule:

ObjectMapper objectMapper = JsonMapper.builder()
        .configure(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE, false)
        .configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)
        .addModule(new JavaTimeModule())
        .build();

方案3:全局配置Jackson时区

如果不想逐个字段配置,可在Spring Boot配置文件中设置全局时区:

spring:
  jackson:
    time-zone: UTC # 替换为业务实际时区
    serialization:
      write-dates-as-timestamps: false

此配置会对所有日期类型的序列化/反序列化生效,包括OffsetDateTime。

内容的提问来源于stack exchange,提问作者Nik Korn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 08:04:53