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
相关产品推荐
相关产品推荐

