メインコンテンツまでスキップ

Appendix C. Leap Years (閏年)

この付録では、閏年の計算ルールと実装について詳しく説明します。

閏年のルール

グレゴリオ暦の閏年ルールは、平均年長を地球の太陽周回の実際の周期(約365.2422日)に近づけるように設計されています。

3つのルール

閏年は次の条件のいずれかを満たす必要があります:

  1. 4で割り切れるが100で割り切れない年は閏年
  2. 400で割り切れる年は閏年

擬似コード:

if (year % 400 == 0) then
return LEAP_YEAR
else if (year % 100 == 0) then
return NOT_LEAP_YEAR
else if (year % 4 == 0) then
return LEAP_YEAR
else
return NOT_LEAP_YEAR

実装例

Python

def is_leap_year(year):
"""閏年かどうかを判定"""
return (year % 400 == 0) or (year % 4 == 0 and year % 100 != 0)

# またはPython calendarモジュールを使用
import calendar
print(calendar.isleap(2000)) # True

歴史的閏年の例

最近の閏年(21世紀)

2000: 閏年 ✅ (400で割り切れる)
2004: 閏年 ✅ (4で割り切れる、100では割り切れない)
2008: 閏年 ✅
2012: 閏年 ✅
2016: 閏年 ✅
2020: 閏年 ✅
2024: 閏年 ✅

世紀年(特殊ケース)

1600: 閏年 ✅ (400で割り切れる)
1700: 平年 ❌ (100で割り切れるが400では割り切れない)
1800: 平年 ❌
1900: 平年 ❌
2000: 閏年 ✅ (400で割り切れる)
2100: 平年 ❌

なぜ閏年が必要か?

地球の太陽周回の実際の周期は約365.2422日で、正確に365日ではありません。

閏年がない場合の影響:
年間誤差: 0.2422日 ≈ 5時間48分46秒
4年後: 約1日
100年後: 約24日

季節が徐々にずれていきます!

グレゴリオ暦の精度:

400年間の閏年数: 97回
平均年長: 365.2425日
誤差: 0.0003日/年
1日の誤差が蓄積するまで約3,333年

重要ポイント: 閏年ルールの正しい実装は、RFC 3339準拠に不可欠です。