返回農曆編算法則


農 曆 法 則 之 疑 惑

初稿: 2018年10月       最近一次重大修訂: 2019年4月



看了農曆的編算法則後,也許讀者會感到疑惑:為什麼要這樣編制農曆?


兼 顧 陰 陽 兩 週

陰陽曆的重點是既要考慮月亮盈虧週期(朔望月),也要照顧季節交替週期(回歸年)。法則三顯然是為了照顧月相。把朔日定為初一,保證初一看不見月亮,農曆月的各日也大致有相同的月相,例如望(滿月)發生在每月的十六日左右。法則四和法則五則是為了使農曆月份不偏離季節。把冬至定在十一月,保證十一月是冬天,因此十一月又稱「冬月」。但是冬至與月相無關,某年的冬至可以發生在朔日,另一年卻可以發生在朔日前一天(又稱「晦日」)。結合法則三,可推斷冬至可以在十一月初一,也可以在十一月最後一日。所以冬至在農曆有三十天的浮動,而在公曆只有三天浮動。

順治二年(1645年)曆法改革前,農曆的月份與中氣有一一對應關係,例如正月必含雨水,二月必含春分等。順治曆改後,這樣的對應關係仍然在大多數時候成立,但會有少數例外,這點在二十四節氣網頁有詳細說明。然而即使在那些少數例外裡,中氣也只是偏離了對應月份僅僅一天而已,因此可以說所有中氣在農曆有約三十天的浮動。所有二十四節氣在公曆裡只有三天浮動,比農曆小得多,這是農曆要兼顧陰陽兩週的代價。


十 九 年 七 閏 法 之 謎

中國在春秋戰國時已發現235(=19×12+7)個朔望月與19個回歸年的時間非常接近,於是採用十九年七閏法編制農曆,即在十九個農曆年裡放置七個閏月。古時稱十九為章歲,七為章閏。後人把章歲和章閏合稱為閏週。

有不少書籍和文章說農曆用十九年七閏法來兼顧陰陽兩週,談到如何在十九年裡加七個閏月時就說以無中氣的月份定為閏月。或許讀者會感到疑惑:以無中氣定閏月為什麼能保證在十九年裡置七個閏月?答案是「不能保證」!首先,「無中氣」置閏法在順治曆改後已廢除,在現行置閏法則下,無中氣的月份雖然大多數確是閏月,但有少數例外。再則十九年七閏法其實在南北朝末期到隋唐間基本上已廢除,原因是19個回歸年比235個朔望月短約二小時,用十九年七閏法制定的曆法(例如猶太曆)在228年會有一日偏差。

戰國至魏晉期間中國的曆法確是採用十九年七閏法,自漢武帝太初元年(公元前104年)起開始採用無中氣法設置閏月。唐朝以前的曆法用平朔法計算合朔,即假設月亮和太陽在天空運行速度是均勻的,兩合朔之間的時間間隔是常數。南北朝以前的曆法一般採用的回歸年與朔望月的比例是235:19,所以19歲正好有235個月。每歲有12個中氣,19歲就有228個中氣,235=228+7,所以有七個月不含中氣,因此以無中氣法置閏能保證十九年有七個閏月。

後來因觀測精度提高,發現十九年七閏法稍嫌粗糙,於是廢棄了回歸年:朔望月=235:19的比例。例如南北朝時期祖沖之創制的《大明曆》實行三百九十一年一百四十四閏,具體做法是取回歸年:朔望月=4836:391,4836 = 391×12 + 144,用無中氣法置閏得391年144閏。這稱之為「破章法」,即打破章閏之法,第一部採用破章法的曆法是《玄始曆》(600年221閏),由北涼國太史著,在北涼行用了28年,在北魏行用了71年。到了唐朝,合朔計算改用定朔,兩合朔的時間間隔不再是常數,到了清朝,連二十四節氣也改用定氣法計算,兩中氣的時間間隔也不再是常數,無中氣法也要修改成現行的置閏法,這樣更不能保證十九年有七個閏月。

雖然閏週只是近似週期,細看按現時置閏法則的閏月分佈,不難發現閏月規律大致符合十九年週期。下表列出從農曆N1930到N2500幾百年間的閏月,分三十行每行七欄排列,每行代表一個閏週的閏月。如前述,法則一在1929年才實施,所以表列的年份從1930年起,以確保所列的閏月都是按相同法則而定。

閏週農曆年: 閏月
1N1930: 六N1933: 五N1936: 三N1938: 七N1941: 六N1944: 四N1947: 二
2N1949: 七N1952: 五N1955: 三N1957: 八N1960: 六N1963: 四N1966: 三
3N1968: 七N1971: 五N1974: 四N1976: 八N1979: 六N1982: 四N1984: 十
4N1987: 六N1990: 五N1993: 三N1995: 八N1998: 五N2001: 四N2004: 二
5N2006: 七N2009: 五N2012: 四N2014: 九N2017: 六N2020: 四N2023: 二
6N2025: 六N2028: 五N2031: 三N2033: 十一N2036: 六N2039: 五N2042: 二
7N2044: 七N2047: 五N2050: 三N2052: 八N2055: 六N2058: 四N2061: 三
8N2063: 七N2066: 五N2069: 四N2071: 八N2074: 六N2077: 四N2080: 三
9N2082: 七N2085: 五N2088: 四N2090: 八N2093: 六N2096: 四N2099: 二
10N2101: 七N2104: 五N2107: 四N2109: 九N2112: 六N2115: 四N2118: 三
11N2120: 七N2123: 五N2126: 四N2128: 十一N2131: 六N2134: 五N2137: 二
12N2139: 七N2142: 五N2145: 四N2147: 十一N2150: 六N2153: 五N2156: 三
13N2158: 七N2161: 六N2164: 四N2166: 十N2169: 六N2172: 五N2175: 三
14N2177: 七N2180: 六N2183: 四N2186: 二N2188: 六N2191: 五N2194: 三
15N2196: 七N2199: 六N2202: 四N2204: 九N2207: 六N2210: 四N2213: 三
16N2215: 七N2218: 五N2221: 四N2223: 九N2226: 七N2229: 五N2232: 三
17N2234: 八N2237: 五N2240: 四N2242: 十一N2245: 六N2248: 五N2251: 三
18N2253: 七N2256: 六N2259: 五N2262: 正N2264: 七N2267: 五N2270: 三
19N2272: 八N2275: 六N2278: 四N2281: 二N2283: 六N2286: 五N2289: 三
20N2291: 七N2294: 六N2297: 四N2300: 二N2302: 六N2305: 五N2308: 三
21N2310: 七N2313: 六N2316: 四N2318: 十N2321: 七N2324: 五N2327: 三
22N2329: 八N2332: 六N2335: 四N2338: 三N2340: 七N2343: 五N2346: 四
23N2348: 八N2351: 六N2354: 五N2357: 正N2359: 七N2362: 五N2365: 四
24N2367: 八N2370: 六N2373: 五N2376: 二N2378: 七N2381: 五N2384: 四
25N2386: 十N2389: 六N2392: 四N2395: 二N2397: 六N2400: 五N2403: 三
26N2405: 八N2408: 六N2411: 五N2414: 二N2416: 七N2419: 五N2422: 三
27N2424: 八N2427: 六N2430: 四N2433: 三N2435: 七N2438: 五N2441: 四
28N2443: 八N2446: 七N2449: 五N2452: 三N2454: 八N2457: 五N2460: 四
29N2462: 八N2465: 六N2468: 五N2471: 三N2473: 七N2476: 五N2479: 四
30N2481: 十N2484: 六N2487: 五N2490: 三N2492: 七N2495: 五N2498: 四

從表中可見閏月確是大致符合十九年週期,例如每一欄的年份確是大多數相差十九年,但有若干例外。粉紅色的方格表示閏月的年份偏離了十九年的規律,例如第三閏週的最後一個閏月早了幾個月出現。每一欄的閏月也大致上閏同一個月,但也有例外。黃色方格表示閏月出現的月份「錯了」,意思是說閏月的月份與其在此欄的其他閏月有頗大偏差。例如在第六閏週裡,N2033的閏月出現在閏十一月,而該欄的其他閏月一般是閏七月、閏八月或閏九月。有趣的是第四欄的閏月在第十七閏週前一般是閏七月、閏八月或閏九月,出見了一連串「錯誤」的閏月後,索性「錯到底」,到了第十七閏週以後改為閏正月、閏二月或閏三月。這些偏離閏週的「異常情況」顯示了閏週只是閏月的近似週期,要使農曆不偏離陰陽兩週,在幾百年內需要有若干閏月打破閏週的規律。

從表中可見自1930年後閏正月會首次出現在N2262,其實這是自順治曆改(1645年)後首次出現的閏正月,這點在前新加波國立大學數學系教授Helmer Aslaksen(現任挪威奧斯陸大學副教授)撰寫的中國曆法中的數學一文中指出,我的獨立計算與他的結果相符。

最後要指出目前不能很準確計算幾百年後的朔和二十四節氣的UTC+8時刻,這是因為地球自轉不均勻,以致難以準確預測幾百年後會有多少閏秒加到UTC上。公元2200年後的時間計算或會有幾分鐘誤差,如果朔或節氣時間發生在離午夜零時幾分鐘之內,朔日和節氣日期或會有一日偏差,這一日之差一般不會影響閏月的編排,但在少數的情況下或會改變閏月,所以上表列出的數據可能有一兩個會有錯,但不會影響閏月的整體分佈。


農 曆 年 月 的 平 均 日 數

乍看農曆編算的法則,似乎不易從中推出農曆年和農曆月的平均週期。其實要估計農曆年月的平均日數不難:農曆月的平均長度應接近朔望月的平均值29.530589日,而農曆年的平均長度應接近回歸年365.2422日。這估計是用反證法而得。假設農曆月的平均長度與朔望月的平均值有頗大偏差,則朔的平均時刻在農曆月裡會漸漸漂移,最終會漂離初一日,但這與法則三相悖,所以原先的假設不成立。同理,假設農曆年的平均值頗大地偏離回歸年,則冬至的平均時刻在農曆十一月會漸漸漂移,最終會漂離十一月,但這與法則四相悖,所以原先的假設不成立。這樣的論述只是估算而不是嚴格證明,其一是因為平均值的運算沒有準確界定,其二是朔望月平均值和回歸年都隨時間而變。

這裡再展示好一點的計算。用FY+k(k是整數)表示農曆年NY+k正月初一UTC正午的儒略日數(所以FY+k是整數);用WY+k表示在公曆Y+k年冬至時刻的儒略日數(所以WY+k一般不是整數);設定ΔFY+k=FY+k - WY+k-1,是從Y+k-1年的冬至到農曆年NY+k正月初一UTC正午的日數。農曆年從NYNY+n這n年的平均日數是

Y = (FY+n+1 - FY) / n = (WY+n - WY-1) / n + (ΔFY+n+1 - ΔFY) / n

(WY+n - WY-1) / n 是兩冬至在Y-1到Y+n年間的平均日數,這個平均值接近回歸年。正月初一是在冬至後的第二或第三個朔日,所以|ΔFY+n+1 - ΔFY|必定少於某常數U。已知正月初一在公曆的1月20日和2月20日之間浮動,冬至在公曆12月21日到12月23日左右浮動,所以U應接近30日。U的確實數字不重要,重要的是U是有限的。所以當n增加,|ΔFY+n+1 - ΔFY| / n 就會越來越少,從而推出農曆年的平均日數接近回歸年。用類似的方法可以得出農曆月的平均日數接近朔望月。

現在來看看實際數據。據我的計算,從N1929到N2200這272農曆年間有99340日,所以農曆年在這272年的平均日數是99340/272=365.22日,比回歸年短約半小時。然而農曆年長度年年不同,其日數在353日與385日之間,標準偏差是14.31日。意味著平均值會隨所取平均的年份而有所變化。例如農曆年在N1929到N2199這271年間的平均日數是365.262日,在N1929到N2198這270年間的平均日數是365.1926日,這些變動主要來自(ΔF1930+n - ΔF1929)/n這項隨著n變化而產生的變動,這變化會隨取平均的年數增加而降底至零。下圖顯示農曆年在N1929NY的平均日數隨著Y由2150到2200的變化。

Average length of a Chinese year

可見農曆年的平均值在365.16日到365.28日之間變動,這就是取270農曆年左右的平均值的結果,要減少平均值的變化,可取更多農曆年的平均值。下圖顯示農曆年在N1929NY的平均日數隨著Y由2878到2928的變化。取平均值的農曆年數高達一千。

Average length of a Chinese year

圖中可見農曆年數目增加到一千左右時,其平均日數在365.224日與365.255日之間變動,變化幅度小了約四倍。這正與預期的一致,因為變動幅度應與n成反比,此處n是取平均的年數。農曆年的平均日數確是接近回歸年365.242日。

現在再看農曆月的平均日數,從N1929N2200這272農曆年間有3364個農曆月(包括閏月),前面說過這272農曆年有99340日,所以農曆月在這3364個月的平均日數是99340/3364=29.5303日。為了知道這個平均值隨月數的變化,下圖顯示農曆月在N1930起算的第一個月到第M個月的平均值隨著M由3300到3364的變化。

Average length of a Chinese year

圖中可見農曆月平均值的變化遠少於農曆年的平均值變化,這是由兩個因數造成。其一是農曆每月的日數變化只有一日(二十九日或三十日),其二是現在在取幾千個數的平均值,而不是幾百個數的平均值。農曆月在這三千幾個月的平均日數在29.5300日和29.5306日之間變動,確是接近朔望月的平均值29.530589日。



返回農曆編算法則