ページ

2015年3月14日土曜日

閏年の計算方法について

calendar.pyのコードを読んでいて、閏年の判定について、どのように計算するのかわかっていなかったため調べました。

ところが調べ始めると、そもそも暦とはなんぞやという所から気になってしまったため、せっかくなのでそれも調べてみました。

簡単に自分の理解をメモします。

まず暦(こよみ)とは、時間の流れを年・月・週・日といった単位に当てはめて数えるよう体系付けたもののことです。

暦の作成方法には幾つかあり、大きく分けると以下の3種類があります。

  • 太陽暦
  • 太陰太陽暦
  • 太陰暦

それぞれの基準は「太陽」、「太陽と月の併用」、「月」です。

(ちなみに、日本では明治5年まで太陰太陽暦が使用されていたようです)

太陽暦の場合、「地球が太陽の周りを回る周期」を基に暦が作られており、その周期は365.24219日です。

小数点以下を切り捨てて、1年を365日としているわけですね。

1年で約0.25日分を切り捨てているため、4年たつと約1日分少なくなり、時間の経過と共にどんどん暦と季節にズレが生じてしまいます。

そこで、このズレを修正するために閏日として余分な1日を暦に追加する必要があります。

しかし、太陽暦にもいくつかの歴法があり、歴法によってこの閏年の計算方法が異なります。

ユリウス暦

  1. 西暦年が4で割り切れる年

グレゴリオ暦

  1. 西暦年が4で割り切れる年は閏年
  2. ただし、西暦年が100で割り切れる年は平年
  3. ただし、西暦年が400で割り切れる年は閏年

修正ユリウス暦

  1. 西暦年が4で割り切れる年は閏年
  2. ただし、西暦年が100で割り切れる年は平年
  3. ただし、西暦年を900で割った余りが200または600になる年は閏年

(西暦2800年にグレゴリオ暦と修正ユリウスにズレが生じます)

精度が高いのは修正ユリウス暦ですが、現行の太陽暦として世界各国で使われているのはグレゴリオ暦です。

閏年の計算にはグレゴリオ暦を採用すれば良いですね。

これで、以下のcalendar.pyにおける閏年の判定もようやく理解できました。

def isleap(year):
    """Return True for leap years, False for non-leap years."""
    return year % 4 == 0 and (year % 100 != 0 or year % 400 == 0)

ところで、閏年(うるうどし、じゅんねん、leap year)の反対は平年(へいねん、common year)って言うんですね。

これは初めて知りました。

参考リンク


0 件のコメント:

コメントを投稿