差异在于实现之间的实现方式
Date以及
Instant与实现之间的交互方式,其中使用格里高利/朱利安日历的日期和使用日期的ISO标准的即时,在儒略历转换之前遵循经过修改的格里高利日历。
该
GregorianCalendar
实现有一个特别说明:
在公历转换之前,GregorianCalendar会执行儒略历。阳历和儒略历之间的唯一区别是the年规则。朱利安历法指定每四年leap年,而公历忽略了不可被400整除的世纪年。
是的,从技术上来讲。但是对于这个问题,我们 不太会 遇到。
cal.set(1582, Calendar.OCTOBER, 4, 0, 0, 0);
如预期的那样,这产生了1582年10月4日的日期。
cal.set(1582, Calendar.OCTOBER, 5, 0, 0, 0);
得出日期为1582年10月 15 日。
蝙蝠侠:这有什么魔力?
好吧,这不是编码错误,实际上是GregorianCalendar的实现。
但是,今年是公历转换的开始,当时被称为Inter gravissimas的罗马教皇引入了公历,从一开始就被西班牙,葡萄牙,波兰-
立陶宛联邦和当今大多数意大利采用。在这些国家/地区,正常年份一直持续到
10月4日(星期四)。但是,第二天成为10月15日(星期五)(就像从星期五开始的普通年份)
摘自1582年的维基百科
当我们检查1582年10月4日时,会发生以下情况:
日期:1582-十月-04 00:00:00
即时:1582-10-14T00:00:00Z
这里有10天的间隔,ISO即时日期的定义说明了即时存在于“技术上不存在的日期”的原因。
该标准规定 每个日期必须是连续的 ,因此儒略历的使用将与该标准相反(因为在转换日期,日期将不是连续的)。
因此,尽管1582年10月14日实际上并不存在,但按照定义,它存在于ISO时间中,但根据朱利安·日历,它出现在1582年10月4日的真实世界中。
由于我假设是从第一段开始的额外leap年漂移,其中朱利安世纪1500、1400、1300、1100、1000、900、700、600、500、300、200、100有额外的leap日,因此公历,我们慢慢地从+10偏移到-1。可以通过以+100为增量调整年份来验证这一点。
如果要 显示
历史事件日期,最好使用
Date或
JulianCalendarDateFormatter来显示正确的正确历史日期,因为它实际出现在历史记录中。打印出历史时期的ISO时间可能看起来没有意义或不准确,但是以这种格式存储时间仍然有效。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)