差异在于如何实施Date
and Instant
它们的实现相互交互,Date 使用公历/儒略历,Instant 使用 ISO 标准的日期,在儒略历切换之前遵循修改后的公历。
The GregorianCalendar
执行有一个特别说明:
在公历转换之前,GregorianCalendar 实现儒略历。公历和儒略历之间的唯一区别是闰年规则。儒略历每四年指定一次闰年,而公历则省略了不能被 400 整除的世纪年。
嗯,是的,从技术上来说。但对于这个问题,我们不quite遇到这个。
cal.set(1582, Calendar.OCTOBER, 4, 0, 0, 0);
正如预期的那样,得到的日期是 1582 年 10 月 4 日。
cal.set(1582, Calendar.OCTOBER, 5, 0, 0, 0);
这会产生一个日期,十月15, 1582.
蝙蝠侠,这是什么魔法?
嗯,这不是编码错误,它实际上是 GregorianCalendar 的实现。
然而,今年见证了公历转换的开始,当时被称为“Inter gravissimas”的教皇敕令引入了公历,从一开始就被西班牙、葡萄牙、波兰立陶宛联邦和当今意大利的大部分地区采用。在这些国家,这一年继续正常进行,直到10 月 4 日,星期四。然而,第二天变成了 10 月 15 日星期五(就像平年从星期五开始一样),
From 维基百科上的 1582
当我们检查 1582 年 10 月 4 日时,会发生以下情况:
日期:1582 年 10 月 4 日 00:00:00
即时:1582-10-14T00:00:00Z
这里有 10 天的间隔,并且该时刻存在于“技术上不存在的日期”的原因由以下定义解释:ISO 即时日期.
该标准规定每个日期必须是连续的,因此使用儒略历将违反标准(因为在切换日期,日期不会连续)。
SO,虽然 1582 年 10 月 14 日在现实中从未存在过,但根据定义,它存在于 ISO 时间中,但根据儒略历,发生在现实世界的 1582 年 10 月 4 日。
由于我认为与第一段有额外的闰年漂移,儒略世纪 1500、1400、1300、1100、1000、900、700、600、500、300、200、100 有额外的闰日未计入公历,我们慢慢地将偏移量从+10 移回到-1。这可以通过以 +100 增量调整年份来验证。
如果你是显示历史事件日期,您最好使用Date
or JulianCalendar
DateFormatter 显示正确正确的历史日期,就像历史上实际发生的那样。打印出历史时期的 ISO 时间可能显得无意义或不准确,但以此格式存储时间仍然有效。