1. ホーム
  2. java

Javaでは0年はうるう年とされているが、0年は存在しない

2023-10-16 11:18:13

質問

私が更新しているいくつかの便利なメソッドのテストケースを書いていたとき、もし LocalDate 's isLeapYear() メソッドで0年について調べました。私の理解では、0年という年は実際には存在しませんでした:西暦1年の前の年は紀元前1年でした。(これは、何年も前に読んだ、出典を忘れてしまった記事に基づいている)。驚いたことに、私のテストは 0 年がうるう年であることを示したのです!

私は java.time.LocalDate クラスは ISO-8601 を実装していますが、ISO-8601 は本当に 0 年が存在したことを示すのでしょうか?私は、テストした人たちが LocalDate をテストした人がテストケースとしてこれを見逃したとは信じがたいですが、ISO-8601 のような国際標準がこのような明白な間違いをするとは信じがたいことでもあります。

もうひとつの可能性は、私が読んだ記事が全面的に間違っていたということです。(あるいは、そのときは正しかったが、後で考え直したということです)。

これは非常に重要なことではありませんが、私は間違いがどこにあるのか知りたいと思っています。ISO-8601、Java の LocalDate クラス、または時間の計算方法に関する私の理解です。

どのように解決するのですか?

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

その LocalDate Javadoc には、この注意書きがあります。

これは、今日のうるう年の規則がずっと適用される、プロレプティックなグレゴリオ暦システムに相当します。今日書かれたほとんどのアプリケーションでは、ISO-8601 の規則が完全に適しています。しかし、歴史的な日付を使用し、それが正確であることを必要とする任意のアプリケーションは、ISO-8601 のアプローチが適していないことがわかります。

ウィキペディアには プロレプティック・グレゴリオ暦 . とりわけ、こう書かれています。

数学的には、負の年(紀元前)と正の年(西暦)の間の年数の計算を容易にするという特定の目的のために、0年を含み、それ以前の年を負として表す方が便利である。これは、天文学的な年号や国際標準の日付システムであるISO 8601で使用されている慣習です。これらのシステムでは、0年はうるう年となります。

この件に関する歴史的な背景について少し脱線しますが、お許しください。

西暦の年は、表向きはイエス・キリストの誕生から数えられていますが、その考え方は6世紀に始まり、現在の暦は16世紀に計算されたものを基にしています。ローマ数字にはゼロや負の数を表すものがなかったため、年は「イエス以後」(AD、西暦の場合は anno domini または、イエス以前(BC、キリスト以前)の年号で数えられた。) したがって、伝統的に、紀元前1年の次はAD1年であり、間にゼロ年はありません。

しかし、1 世紀には、誰もそのように年を数えませんでした。比較のために、ルカによる福音書では、イエスが伝道を開始した年を

ティベリウス・カエサルの治世の第十五年に、ポンテオ・ピラトはユダヤの総督であり、ヘロデはガリラヤの四頭領、その兄弟フィリポはイトゥレアとトラコニテス地方の四頭領、リュサニアスはアビレネの四頭領であった」。

ルカはイエスが当時約30歳であったと記述しているので、表向きはこれはAD30年であったでしょう。しかし、現代の歴史家たちは一般的に、ディオニュシオス・エクシグウス(Dionysius Exiguus)が anno domini しかし、現代の歴史家は、AD525年にシステムを提案したディオニュシオス・エクシグウスがそれを間違えたため、年数の数え方が少なくとも1年か2年はずれていると考えています。(正確な日付はまだ議論の余地がある。 ウィキペディア をご覧ください)。

ユリウス暦からグレゴリオ暦への移行でさえ、2週間以内のズレであり、数世紀にわたってヨーロッパ中で行われたため、大規模な政治的抵抗に遭いました--年号の変更が今どれほど混乱を招くか想像できますね

では、この歴史は今日のソフトウェアとどのような関係があるのでしょうか。残念ながら、歴史を通じて日付が計算され書き留められた方法は無数にあるため、時間を進めたり戻したりする際にカレンダーが一貫した方法で動作することをあきらめるか、計算された日付が実際の人々が当時使用していた日付に対応することをあきらめる必要があります。ヨーロッパの多くの国々は、100年も前にまだユリウス暦を使用しており、ヨーロッパの他の国々とほぼ2週間の食い違いがあったのです。


理解できますね。 LocalDate はこの混乱から手を引き、今日私たちが使っている方法でカレンダーを実装しているだけです。Javadoc に書いてあることを繰り返します。 今日書かれたほとんどのアプリケーションでは、ISO-8601 の規則が完全に適しています。 しかし、歴史的な日付を使用し、正確であることを必要とするアプリケーションでは、ISO-8601 のアプローチは適切ではありません。