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

JSON字符串日期反序列化为Calendar格式不符,如何获取指定格式的Calendar?

问题分析

你遇到的核心问题是混淆了JSON反序列化的解析规则和Calendar对象的显示格式:

  • @JsonFormat(Pattern="yyyy-MM-dd HH:mm:ss.SSS")的作用是告诉Jackson如何将JSON中的日期字符串解析为Calendar对象,反序列化成功说明解析逻辑是正确的。
  • 你看到的java.util.GregorianCalendar[time=...]是Calendar默认的toString()输出,它展示的是对象内部的状态信息,不是格式化后的日期字符串。
解决方案

要得到yyyy-MM-dd HH:mm:ss.SSS格式的日期字符串,需要通过日期格式化工具将Calendar对象转换,而非修改Calendar本身的行为。

方式1:直接转换为格式化字符串(推荐)

在需要使用日期字符串的地方,用格式化工具转换:

Java 7及以下(使用SimpleDateFormat)

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
// 如需指定时区,可添加:sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
String formattedDate = sdf.format(responseDateTime.getTime());

Java 8+(使用DateTimeFormatter,线程安全更可靠)

import java.time.format.DateTimeFormatter;
import java.time.ZoneId;

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
// 转换为ZonedDateTime后格式化,示例用系统默认时区,可自行指定
String formattedDate = formatter.format(responseDateTime.toInstant().atZone(ZoneId.systemDefault()));

方式2:控制Jackson序列化时的输出格式

如果你的需求是将这个Calendar对象再次序列化为JSON时输出指定格式的字符串,那么保留@JsonFormat注解即可——Jackson在序列化时会按照该格式输出日期字符串,无需额外处理。

注意事项
  • 不要重写Calendar的toString()方法,这会破坏Java标准库的原有行为,引发潜在问题。
  • SimpleDateFormat是非线程安全的,多线程环境下要避免共享实例,可通过ThreadLocal包裹使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 05:40:00