java Jackson错误地序列化了XMLGregorianCalendar
有一个XMLGregorianCalendar
对象包含值"2021-01-18T18:43:26.884Z"
(这是它在toString()
中的输出)。当我尝试与Jackson序列化此日期时,我会在3小时后的输出中获得一个日期:
XMLGregorianCalendar date = ...;
ObjectMapper mapper = new ObjectMapper();
String out = mapper.writeValueAsString(obj); // Output: 1610995406884 (Converted to Date: Mon Jan 18 21:43:26 MSK 2021)
我怎样才能解决这个问题
# 1 楼答案
根本没有问题
在
XMLGregorianCalendar
中的时间"2021-01-18T18:43:26.884Z"
是格林威治标准时间(格林威治标准时间,伦敦)的18:43或UTC+0(因为尾随Z
)另一方面,您有一个带有字符串表示的
Date
对象"Mon Jan 18 21:43:26 MSK 2021"
, 这是MSK时区(莫斯科标准时间)的21:43或UTC+3。Date
类选择这个时区来格式化输出 只是因为你的电脑位于莫斯科附近所以两者实际上是同一个时间点, 只针对两个不同的时区进行了字符串化
# 2 楼答案
java.util.Date
表示自历元以来的毫秒数java.util.Date
对象不是像modern date-time types那样的实时日期对象;相反,它表示自称为“历元”的标准基准时间(即January 1, 1970, 00:00:00 GMT
(或UTC))以来的毫秒数。打印java.util.Date
的对象时,其toString
方法返回JVM时区中的日期时间,根据该毫秒值计算。如果需要在不同的时区中打印日期时间,则需要将时区设置为SimpleDateFormat
,并从中获取格式化字符串输出:
请注意
java.util
的日期时间API及其格式化APISimpleDateFormat
已过时且容易出错。建议完全停止使用它们,并切换到modern date-time API使用^{} 将传统
java.util.Date
转换为现代java.time.Instant
:输出:
Z
代表Zulu
,代表UTC(或GMT)