Java与JavaScript Unix时间戳日期转换出现10天偏差的原因咨询
日期转换差异的成因:历法切换的历史问题
这个差异的核心原因是1582年儒略历转格里高利历的历史变更,以及Java和moment.js对历史日期采用的历法规则不同:
- 历史背景:1582年之前欧洲普遍使用儒略历,但儒略历的闰年规则(每4年一闰)存在微小误差,累积到1582年时,日期已比实际天文时间差了10天。因此罗马教皇格里高利十三世推行格里高利历,直接将1582年10月4日的次日定为10月15日,跳过中间10天修正误差。
- Java的
SimpleDateFormat处理逻辑:它遵循真实历史的历法切换规则——1582年之前用儒略历计算日期,之后用格里高利历。你输入的1581-01-01属于儒略历时期,Java会按儒略历将其转换为对应绝对时间戳(-12274711740000)。 - moment.js的处理逻辑:它默认使用扩展格里高利历(把格里高利历规则回溯到公元元年之前,不考虑历史上实际使用的儒略历)。用该时间戳转换时,moment.js按扩展格里高利历计算日期,而儒略历的
1581-01-01刚好对应扩展格里高利历的1581-01-11,两者差10天,这就是你看到的偏差。
1582年之后的年份,两种历法已通过跳日操作对齐,所以Java和moment.js的转换结果自然一致。
内容的提问来源于stack exchange,提问作者Logan L.
相关产品推荐
相关产品推荐

