亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java 說第 0 年是閏年,但第 0 年從未存在過

Java 說第 0 年是閏年,但第 0 年從未存在過

慕絲7291255 2021-12-01 15:27:31
我正在為一些我正在更新的便捷方法編寫一些測試用例,并決定看看如果我在 0 年使用LocalDate'sisLeapYear()方法會發生什么。據我所知,0 年實際上從未存在過:公元 1 年之前的一年是 1公元前。(這是基于我多年前讀過的一篇文章,我早已忘記了它的來源。)令我驚訝的是,我的測試表明 0 年是閏年!我意識到java.time.LocalDate該類實現了 ISO-8601 但 ISO-8601 真的表明 0 年存在嗎?我不愿意相信進行測試的人LocalDate會錯過這個作為測試用例的人,但我也不愿意相信像 ISO-8601 這樣的國際標準會犯如此明顯的錯誤。另一種可能性是我閱讀的文章完全錯誤。(或者當時是正確的,但后來被重新考慮。)這不是很重要,但我很想知道錯誤在哪里:ISO-8601、Java 的LocalDate類,或者我對時間計算方式的理解。
查看完整描述

2 回答

?
catspeake

TA貢獻1111條經驗 獲得超0個贊

LocalDate正在按照國際標準 (ISO 8601) 做記錄在案的事情。這是否“正確”是一個完全不同的問題。

LocalDateJavadoc中本身就包含這個警告:

它相當于預兆公歷系統,其中今天的閏年規則適用于所有時間。對于當今編寫的大多數應用程序,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 方法不合適?!?/strong>


查看完整回答
反對 回復 2021-12-01
?
慕容森

TA貢獻1853條經驗 獲得超18個贊

來自維基百科

...天文年編號(與公元前 1 年的儒略年一致)和 ISO 8601:2004(與公元前 1 年的格里高利年一致)有一個零年


查看完整回答
反對 回復 2021-12-01
  • 2 回答
  • 0 關注
  • 335 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號