我正在为一些方便的方法编写一些测试用例,我正在更新,并决定看看如果我在0年使用LocalDate的isLeapYear()方法会发生什么.据我所知,0年实际上从未存在过:公元1年前的那一年是1公元前.(这是基于我多年前读过的一篇文章,其中我早已忘记了这篇文章.)令我惊讶的是,我的测试表明,0年是闰年!
我意识到java.time.LocalDate该类实现了ISO-8601,但ISO-8601是否真的表明存在0年?我不愿意相信那些经过测试的人LocalDate会错过这个测试用例,但我也不愿意相信像ISO-8601这样的国际标准会犯这样一个明显的错误.
另一种可能性是我读过的文章只是错了.(或者它是正确的,但后来又重新考虑了.)
这并不是非常重要,但我很想知道错误在哪里:ISO-8601,Java的LocalDate课程,或者我对时间如何计算的理解.
Dan*_*den 105
TL; DR:LocalDate按照国际标准(ISO 8601)进行记录.这是否"正确"是一个完全不同的问题.
该LocalDateJavadoc中本身就包含这个警告:
它等同于预感格里高利历系统,其中今天的闰年规则一直适用.对于今天编写的大多数应用程序,ISO-8601规则是完全合适的.但是,任何使用历史日期并要求它们准确的应用程序都会发现ISO-8601方法不合适.
维基百科有关于公历格里高利历的更多信息.除其他外,它说:
在数学上,为了便于计算负(BC)年和正(AD)年之间的年数,特定目的是包括0年并将早年代表为负数更方便.这是在天文年编号和国际标准日期系统ISO 8601中使用的惯例.在这些系统中,0年是闰年.
请原谅我一会儿,我会深入研究这一切的历史背景.
西方历法中的岁月表面上是从耶稣基督的诞生开始计算的,但这样做的想法始于六世纪,而我们现在的历法是基于十六世纪的计算.由于罗马数字没有零和负数的表示,因此年份要么"在耶稣之后"(AD,对于anno domini)或"在耶稣之前"(BC,对于"在基督之前").因此,传统上,1 BC后面是AD 1,其间没有零年.
然而,在第一世纪,没有人像这样计算年数; 相比之下,路加福音描述了耶稣开始他的事工的那一年
在Tiberius Caesar统治的第十五年,Pontius Pilate是犹太的州长,Herod是加利利的分封者,他的兄弟是Ituraea和Trachonitis地区的腓利特分子,以及Abilene的分裂者Lysanias,
表面上看,这可能是公元30年,因为卢克将耶稣描述为当时"大约三十岁".但是,现代历史学家普遍认为,在公元525年提出年度多米尼系统的狄奥尼修斯(Dionysius Exiguus)认为它错了,因此年数的数量至少会减少一到两年.(具体日期仍有争议; 如果您关心更多细节,请参阅维基百科.)
但是现在修复已经太晚了; 甚至从朱利安到格里高利历的转变,这是一个不到两周的差异,在几个世纪的时间里,整个欧洲都发生了转变,遭到了广泛的政治阻力 - 你可以想象一下年代数变化是多么具有破坏性会是现在!
那么这段历史与今天的软件有什么关系呢?不幸的是,由于历史记录中计算和记录日期的方式不同,您需要放弃日历,以便在向前和向后移动时以一致的方式行事,或者您必须放弃计算日期与当时真正的人会使用的日期有任何对应关系.分歧的发生速度比您想象的要快:许多欧洲国家在不到100年前仍在使用儒略历,与欧洲其他所有人的差距已近两周!
可以理解的是,LocalDate洗手这个烂摊子只是按照我们今天使用它的方式实现日历.重申Javadoc所说的内容:"对于今天编写的大多数应用程序,ISO-8601规则完全合适.但是,任何使用历史日期并要求它们准确的应用程序都会发现ISO-8601方法不合适."
| 归档时间: | 
 | 
| 查看次数: | 7289 次 | 
| 最近记录: |