我們現在使用的曆法屬於太陽曆,也就是以太陽運行為標準所訂下的,大多數人都知道有一個用來修正時間的規則 — 閏年,使的特定年份會有366天,但其中設計這套規則的意義就較不為人所知了。

從閏年規則說起,以下是我們熟知的閏年規則

  • 每四年閏一年
  • 逢百年不閏
  • 逢四百年閏一年

說起來還真的有些複雜,事實上,我們所說的修正,其實是在修正我們所認知的一年與回歸年(tropical year)之間的差距,那甚麼是回歸年呢?


回歸年

回歸年是指太陽在黃道上回到同一位置的週期,是從地球上觀察的角度定義的,一回歸年等於365.2422個平均太陽日,又因為地球自轉軸進動(自轉軸每年會有小角度變化,這又是另一個學問,在此先不談)的影響,每年會和恆星年有 20分24秒的差距。

 一年 = 365平均太陽日

1回歸年 = 365.2422平均太陽日

1恆星年 = 365.2564平均太陽日

每年有 365.2422天,那少過的0.2422天呢? 我們沒辦法過 0.2422天,但也不能當作沒這回事啊,因此將他累積起來,積到差不多一天的時候再來修正,因此每四年會閏一年,但 0.2422 * 4 ≠ 1,所以接下來會繼續累積,修正,累積,修正……我用下面的算式說明。

過了四年,總共少0.9388天
-0.2422天 * 4 = -0.9388天

每四年閏一次,多加一天進去,但這樣卻多了0.0312天

-0.9388天 +1天 = 0.0312天     

過了一百年後,居然多了

0.78天  0.0312天 * 25 = 0.78天     

於是逢百不閏,扣掉多的天數,但又少0.22天

0.78天 - 1 = -0.22天     

四百年後,少的天數達0.88天

-0.22天 * 4 = -0.88天     

逢四百一閏,減掉多餘的一天

-0.88天 + 1 = +0.12天

各位可能會有個疑問,就算四百年閏一天,不也還有多0.12天嗎? 為甚麼不繼續寫下去? 沒錯!的確是要修正,照理會在0.12天 * 8 = 0.96天發生時修正,也就是每3200年一次,不過現在是2017年,還用不到,所以沒有才制定,大致上這就是為什麼要閏年,又為什麼是這樣的規則的原因。

閏年的計算在以程式語言實作非常簡單,僅需簡單的運算與判斷即可達成,放上一段範例 code。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
def IsLeapYear(year):
    if year % 400 == 0:
        return True   #是閏年
 
    elif year % 100 == 0:
        return False  #不是閏年
 
    elif year % 4 == 0:
        return True   #是閏年
 
    return False      #不是閏年