Joda Time处理0000年即时时间/负纪元时间戳日期偏差是bug吗?
结论
该差异既不是使用错误,也不是Joda Time的bug,是两类API采用的纪年标准不同导致的正常现象。
具体差异说明
- java.util.Date的底层纪年规则:遵循传统公历纪年,不存在公元0年,公元前1年之后直接是公元1年,其
toString()输出的年份基于这套规则计算。 - Joda Time、java.time的底层纪年规则:严格遵循ISO 8601国际标准,该标准明确定义了公元0年(对应传统纪年的公元前1年),时间显示完全符合这套标准的计算逻辑。
测试结果验证
你使用的时间戳-62135640000000L对应的ISO标准UTC时间就是0000-12-31T12:00:00Z,Joda Time和java.time的输出完全一致,属于正确结果。
java.util.Date输出的Sun Jan 02 12:00:00 UTC 1是因为它在toString阶段自动做了纪年规则转换:把ISO体系的0000年映射为传统纪年的公元1年,同时附带了规则转换带来的日期偏移。
兼容方案
如果需要Joda Time输出和java.util.Date一致的纪年结果,替换默认的ISO纪年系统为GregorianJulianCalendarSystem即可。
内容的提问来源于stack exchange,提问作者Kashyap
相关产品推荐
相关产品推荐

