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

OffsetDateTime反序列化时毫秒位末尾0被截断的问题求助

解决Jackson反序列化OffsetDateTime时毫秒位末尾0被截断的问题

要让OffsetDateTime序列化后保留完整三位毫秒(比如2023-06-20T06:59:31.400Z而不是2023-06-20T06:59:31.4Z),需要调整Jackson的日期格式化配置,具体操作如下:

  • 替换过时的JSR310Module为JavaTimeModule,这是Jackson 2.8+版本推荐用于处理Java 8日期时间API的模块。
  • 为OffsetDateTime指定固定格式化模式"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'",强制保留三位毫秒位。
  • 禁用DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE,避免时区自动调整导致格式异常。

完整的ObjectMapper配置代码如下:

ObjectMapper jsonMapper = new ObjectMapper();
// 保留原有配置
jsonMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
jsonMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
jsonMapper.configure(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS, false);

// 配置JavaTimeModule并绑定格式化器
JavaTimeModule timeModule = new JavaTimeModule();
DateTimeFormatter offsetDateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
timeModule.addSerializer(OffsetDateTime.class, new OffsetDateTimeSerializer(offsetDateTimeFormatter));
timeModule.addDeserializer(OffsetDateTime.class, new OffsetDateTimeDeserializer(offsetDateTimeFormatter));

jsonMapper.registerModule(timeModule);
// 禁用时区自动调整,保证序列化结果时区与原数据一致
jsonMapper.disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE);

关键说明

  • 通过OffsetDateTimeSerializer和OffsetDateTimeDeserializer绑定指定格式,强制输出三位毫秒,即使末尾为0也不会被截断。
  • JavaTimeModule是JSR310Module的替代方案,功能更完善且处于活跃维护状态,建议优先使用。

内容的提问来源于stack exchange,提问作者mathew thomas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 08:57:06