在java.util.Date和java.time.Instant之间转换古代日期时的差异

在java.util.Date和java.time.Instant之间转换古代日期时的差异,第1张

在java.util.Date和java.time.Instant之间转换古代日期时的差异

差异在于实现之间的实现方式

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
JulianCalendar
DateFormatter来显示正确的正确历史日期,因为它实际出现在历史记录中。打印出历史时期的ISO时间可能看起来没有意义或不准确,但是以这种格式存储时间仍然有效。



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/4910440.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-12
下一篇 2022-11-12

发表评论

登录后才能评论

评论列表(0条)

保存