web-dev-qa-db-ja.com

Javaによると、その年はうるう年ですが、その年は存在しませんでした。

私は更新している便利なメソッドのいくつかのテストケースを書いていて、0年目にLocalDateisLeapYear()メソッドを使用した場合に何が起こるかを見てみることにしました。紀元前。 (これは私が何年も前に読んだ記事を元にしていたことに基づいています。)私のテストでは、0年目がうるう年であることを示しました。

私はJava.time.LocalDateクラスがISO-8601を実装していることに気づきましたが、ISO-8601は本当に0年目が存在したことを示しているのでしょうか?私はLocalDateをテストした人々がテストケースとしてこれを見逃していたと信じることを躊躇していますが、私はISO-8601のような国際規格がそのような明白な間違いを犯すと信じるのも嫌です。

もう一つの可能​​性は、私が読んだ記事が単調な間違いだったということです。 (あるいは当時は正しかったが、後で考え直された。)

これはそれほど重要ではありませんが、間違いがどこにあるのかを知りたいと思います。ISO-8601、JavaのLocalDateクラス、または私の理解している時間の長さについて。

71
Henry

TL; DR:LocalDateは国際標準(ISO 8601)に従って、文書化されているとおりに行動しています。これが「正しい」かどうかはまったく別の問題です。

LocalDate Javadoc 自体にこの警告が含まれています。

これは、現在のうるう年の規則が常に適用される、プロレプティックグレゴリオ暦システムと同等です。今日書かれているほとんどのアプリケーションにとって、ISO-8601規則は完全に適しています。しかしながら、歴史的な日付を利用し、そしてそれらが正確であることを要求するどんなアプリケーションもISO-8601アプローチが不適当であると感じるでしょう。

ウィキペディアには proleptic Gregorian calendar の詳細があります。とりわけ、それは言う:

数学的には、マイナス(BC)年とプラス(AD)年の間の年数の計算を容易にするために、0年を含め、それ以前の年をマイナスとして表す方が便利です。これは、天文年の番号付けおよび国際標準の日付システムであるISO 8601で使用されている規則です。これらのシステムでは、0年目はうるう年です。

私がこれらすべてについて歴史的な文脈を掘り下げている間、ちょっと私を許してください。

西暦の年数はイエス・キリストの誕生から明らかに数えられていますが、そうするという考えは6世紀に始まり、私たちの現在の暦は16世紀に行われた計算に基づいています。ローマ数字にはゼロも負数も表現されていなかったので、年は「イエスの後」(AD、anno domini)、または「イエスの前」(BC、「キリストの前」)のいずれかに数えられました。したがって、伝統的には、西暦1年の後に西暦1年が続き、その間に年ゼロはありませんでした。

しかし、1世紀には、誰もそのように年を数えることはありませんでした。比較のために、ルカによる福音書はイエスが宣教を始めた年を次のように述べています。

ティベリウス・シーザーの治世の15年目には、ユダヤの総督であるポンティウス・ピラト、そしてガリラヤの、そしてイトゥラアとトラコニチスの地域の、彼の兄弟であるピリポの兄弟。

ルークはイエス様を当時「約30歳」であると言っていたので、これはおそらくAD 30歳でした。しかし現代の歴史家たちは一般に、西暦525年に anno domini システムを提案したDionysius Exiguusがそれを誤解したので、年の番号付けが少なくとも1または2年ずれていることに同意します。 (正確な日付はまだやや物議をかもしています。もっと詳しく知りたい場合は Wikipedia をご覧ください。)

しかし、今すぐ修正するには遅すぎます。ユリウス暦からグレゴリオ暦への移行(2週間以内の矛盾)であっても、ヨーロッパ全体で数世紀に渡って転換が行われたため、広範な政治的抵抗がありました。今だろう!

それでは、この歴史は今日のソフトウェアと何の関係があるのでしょうか。あいにく、日付が計算されて歴史を通して書き留められた無数の方法のために、あなたが時間を前後に動くように一貫した方法で振る舞うカレンダーをあきらめる必要があるか、あなたは計算された日付をあきらめなければなりません実在の人々が当時使用していたであろう日付に何らかの対応を持つこと。乖離は想像以上に早く起こります:ヨーロッパの多くの国々はまだ100年も前にユリウス暦を使用していましたが、ヨーロッパの他の人たちとは2週間近く矛盾しています!


当然のことながら、LocalDateはこの混乱から手を洗い、カレンダーを今日使用している方法でのみ実装します。 Javadocの言っていることを繰り返します: "今日書かれているほとんどのアプリケーションにとって、ISO-8601のルールは完全に適しています。しかし、歴史的な日付を利用し、正確であることが要求されるアプリケーションは不適切です。 "

105
Daniel Pryden

から ウィキペディア

...天文年の番号付け(紀元前1年のユリウス暦と一致する場合)およびISO 8601:2004の場合(紀元前1年のグレゴリオ暦と一致する場合)にはゼロ年があります。

10
Alex Taylor