メインコンテンツへ
基礎知識

閏年のルール - グレゴリオ暦の 400 年周期と例外則

なぜ閏年が必要なのか - 暦年と回帰年の差

地球が太陽の周りを 1 周する「回帰年」の長さは 365.2422 日であり、365 日ちょうどではありません。暦の 1 年を 365 日に固定すると、毎年約 0.2422 日 (5 時間 48 分 46 秒) ずつ季節がずれていきます。100 年で約 24 日のずれとなり、放置すれば北半球の真冬に夏至が訪れる事態になります。これを補正するために、4 年に一度 2 月を 29 日にする閏年の仕組みが導入されました。

1 年の長さが 365 日ぴったりではないことは、古代から知られていました。古代エジプトの民用暦は 1 年を 365 日に固定し閏日を置かなかったため、暦と季節のずれが約 1461 年かけて 1 周してもとに戻る「ソティス周期」として現れました。これはずれを補正する制度ではなく、補正しなかった結果として観測された現象です。4 年に 1 度の閏日を制度として定着させたのは、紀元前 46 年にユリウス・カエサルが採用したユリウス暦です。ユリウス暦では 1 年の平均長を 365.25 日と定義し、回帰年との差は 1 年あたり約 11 分 14 秒に圧縮されました。しかしこの誤差も 128 年で 1 日に達するため、長期的にはさらなる補正が必要でした。

グレゴリオ暦の登場 - 1582 年の暦改革

1582 年、ローマ教皇グレゴリウス 13 世はユリウス暦の誤差を修正する新しい暦を制定しました。その時点で蓄積していた誤差は約 10 日に達し、復活祭の日付を決める春分の日が暦の上では 3 月 11 日にずれていたのです。改革では 1582 年 10 月 4 日 (木) の翌日を 10 月 15 日 (金) とすることで、累積誤差を一気に解消しました。

同時に、ユリウス暦の閏年規則を以下のように修正しました。「4 で割り切れる年は閏年。ただし 100 で割り切れる年は閏年ではない。さらに 400 で割り切れる年は閏年」というのがグレゴリオ暦の閏年判定です。これにより 400 年間の閏年数が 100 回から 97 回に減り、平均年長は 365.2425 日となります。回帰年との差は 1 年あたり 0.0003 日まで縮まり、3300 年に 1 日程度の誤差に抑えられています。

100 年 / 400 年ルールの実例

100 年 / 400 年ルールの影響を受ける年は、世紀の変わり目に集中します。1700 年、1800 年、1900 年は 100 で割り切れるが 400 では割り切れないため、平年でした。一方で 1600 年と 2000 年は 400 で割り切れるため閏年です。多くの人にとって 2000 年は人生で唯一経験する 400 年ルールの閏年であり、この特殊性に気づかなかった人も少なくありません。

次に同じ状況が訪れるのは 2400 年です。それまでに、2100 年 / 2200 年 / 2300 年は閏年ではなく平年として扱われます。ソフトウェアが 100 年先のルールまで正しく実装していても、テストデータが 21 世紀の値しか持たない場合、100 年ルールの分岐が一度も走らずに見過ごされる可能性があります。

実装の落とし穴 - 単純な 4 年判定では足りない

プログラミングで閏年判定を書く際、初学者が陥る最大の罠は「4 で割り切れれば閏年」と単純化することです。JavaScript の new Date(2100, 1, 29) は 3 月 1 日に正規化されますが、自前で日付計算を行うコードでこの規則を見落とすと、2100 年 2 月 29 日という存在しない日を生成してしまいます。境界値テストでは 2000 年 / 2100 年 / 2400 年の 3 パターンを必ずカバーする必要があります。

もう一つの注意点は、システム側のライブラリに任せられる場面では極力任せることです。Java の Year.isLeap()、Python の calendar.isleap()、PostgreSQL の日付関数など、各環境には信頼できる実装が用意されています。自前で書く必要があるのは組み込み環境や特殊な暦法を扱う場合に限定すべきです。標準ライブラリは長年のバグ修正の積み重ねを反映しており、グレゴリオ暦の規則を過去へさかのぼって一律に適用する「先進グレゴリオ暦」として一貫した結果を返します。逆に言えば、1582 年より前の日付は当時実際に使われていたユリウス暦の日付とは一致しないため、歴史的な日付を扱う場合はこの前提を意識する必要があります。

西暦 4000 年問題と未来の暦改革

グレゴリオ暦でも、3300 年に 1 日の誤差は累積していきます。19 世紀の天文学者ジョン・ハーシェルは「4000 年で割り切れる年も平年とする」追加ルールを提案しましたが、これは公式に採用されていません。仮に採用されれば 4000 年 / 8000 年が平年扱いとなり、平均年長が 365.24225 日まで縮まります。

実際には、人類が 4000 年まで現在の暦を使い続ける保証はなく、それまでに別の暦改革が起きる可能性も十分にあります。問題は、既に存在する膨大な歴史データがグレゴリオ暦を前提に記録されていることです。閏年計算ロジックを変更する際は、過去のタイムスタンプとの整合性をどう保つかが重要な設計課題となります。グレゴリオ暦の閏年規則そのものは算術的な規則として期限なく定義されていますが、4000 年則のような追加補正を将来入れるかどうかについては、今のところ国際的な合意はありません。

閏年にまつわる豆知識

2 月 29 日生まれの人 (リーパー) は、4 年に 1 度しか正確な誕生日を迎えられません。各国の法律はこの日付を平年でどう扱うかを定めており、日本の年齢計算ニ関スル法律では 2 月 28 日の経過と同時に 1 歳加算されると解釈されます。一方、香港 / 英国では、平年の法律上の誕生日を 3 月 1 日として扱う考え方が知られています。

夏季オリンピックと米国大統領選挙は、いずれも 4 の倍数の年に開催されます。閏年も基本は 4 の倍数の年なので、両者はほぼ重なります。これは不思議な一致ではなく、どちらも同じ 4 年周期の目盛りに乗っているだけです。ただし完全に一致するわけではありません。100 年ルールの例外年ではずれが生じ、夏季オリンピックと米国大統領選挙が行われた 1900 年は閏年ではなく平年でした。次に同じずれが起こるのは 2100 年です。

この記事は役に立ちましたか?

関連記事