2 回答
TA贡献1111条经验 获得超0个赞
LocalDate
正在按照国际标准 (ISO 8601) 做记录在案的事情。这是否“正确”是一个完全不同的问题。
该LocalDate
Javadoc中本身就包含这个警告:
它相当于预兆公历系统,其中今天的闰年规则适用于所有时间。对于当今编写的大多数应用程序,ISO-8601 规则完全适用。但是,任何使用历史日期并要求它们准确的应用程序都会发现 ISO-8601 方法不合适。
维基百科有更多关于公历的信息。除其他外,它说:
在数学上,为了便于计算负 (BC) 年和正 (AD) 年之间的年数,将更早的年份表示为负数会更方便。这是天文年编号和国际标准日期系统 ISO 8601 中使用的约定。在这些系统中,0 年是闰年。
请原谅我,因为这一切,我会离题到一些历史背景。
西方历法中的年份表面上是从耶稣基督的诞生开始计算的,但这样做的想法始于 6 世纪,而我们目前的日历是基于 16 世纪的计算。由于罗马数字既不代表零也不代表负数,因此年份要么被计算为“耶稣之后”(AD,表示anno domini),要么“耶稣之前”(BC,表示“基督之前”)。因此,传统上,公元前 1 年之后是公元 1 年,中间没有零年。
然而,在第一世纪,没有人这样计算年数。相比之下,路加福音将耶稣开始传道的那一年描述为
凯撒提比略十五年,本丢彼拉多为犹地亚的总督,希律为加利利的分封王,他的兄弟腓力分封为伊图雷亚和特拉科尼蒂斯地区的分封王,吕萨尼亚为亚比林的分封王,
表面上这应该是公元 30 年,因为路加描述耶稣当时“大约三十岁”。但现代历史学家普遍认为,公元 525 年提出anno domini系统的Dionysius Exiguus错了,因此年数至少相差一两年。(确切日期仍然有些争议;如果您想了解更多细节,请参阅维基百科。)
但现在修复已经太晚了;即使是从儒略历到格里高利历的过渡,相差不到两周,也遇到了广泛的政治阻力,因为这种转变在整个欧洲发生了几个世纪——你可以想象年份编号的变化是多么具有破坏性将是现在!
那么这段历史与今天的软件有什么关系呢?不幸的是,由于历史上计算和记录日期的方式多种多样,您要么需要在时间前后移动时以一致的方式放弃日历,要么必须放弃计算出的日期与真实的人当时会使用的日期有任何对应关系。分歧发生的速度比你想象的要快:不到 100 年前,许多欧洲国家仍在使用儒略历,与欧洲其他国家相差近两周!
可以理解的是,LocalDate
洗掉这个烂摊子,只按照我们今天使用的方式来实现日历。重申 Javadoc 所说的:“对于今天编写的大多数应用程序,ISO-8601 规则完全合适。但是,任何利用历史日期并要求它们准确的应用程序都会发现 ISO-8601 方法不合适。”
添加回答
举报