農 曆 編 算 法 則

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


中國自公元1912年(民國元年)起採用公曆(即格里高里曆),但是傳統的農曆仍在民間使用,而且大多數傳統節日及公眾假期仍依照農曆,所以有必要對農曆有基本認識。本網頁旨在簡單介紹農曆的編算法則。坊間有不少談論曆法的通俗書籍可供有興趣的讀者參閱,例如唐漢良先生的《历书百问百答》唐汉良


內容

  1. 引 言
  2. 重 要 概 念
    1. UT1, UTC, 中 國 標 準 時
    2. 農 曆 的 紀 年、紀 月 和 紀 日 法
    3. 中 氣 和 歲
  3. 現 代 農 曆 的 編 算 法 則
  4. 農 曆 編 算 例 子
    1. 例 一: 推 算 N2017 (丁 酉 年) 的 所 有 農 曆 月
    2. 例 二: 推 算 N2033 (癸 丑 年) 的 所 有 農 曆 月
    3. 異 常 的 年 份 N2033 (癸 丑 年)
  5. 農 曆 法 則 之 疑 惑
    1. 兼 顧 陰 陽 兩 週
    2. 十 九 年 七 閏 法 之 謎
    3. 農 曆 年 月 的 平 均 日 數
  6. 《農 曆 的 編 算 和 頒 行》: 2017 年 國 家 標 準 (GB/T 33661-2017)

    備註和參考文獻


引 言

曆法是為了紀錄時間而制。在古代,有三個週期對人們日常生活很重要:晝夜交替的週期、月亮盈虧的週期和季節交替的週期。晝夜交替的平均時間是平太陽日。月亮盈虧的週期是朔望月,其平均值是29.5306日。季節交替的週期是回歸年(古代稱「歲實」),可由兩冬至或兩春分的平均時間以定,其值為365.2422日註一。「日」的概念緣自晝夜交替,「月」的概念緣自月亮盈虧,「年」或「歲」的概念緣自季節交替。

曆法要解決的其中一個重要問題是怎樣編排年月日。上述三個週期彼此之間的比例都不能約化成簡單分數,這使編制曆法頗為困難。其中一個辦法是不理會朔望月,只考慮回歸年,年和月按特定規律編排,使一年的平均週期近似回歸年,這樣的曆法稱為「太陽曆」,簡稱「陽曆」,公曆(格里高里曆)就是一種陽曆。另一個辦法是不理會回歸年,年和月按特定的規律編排,使一個月的平均週期接近朔望月,這樣的曆法稱為「太陰曆」,簡稱「陰曆」,伊斯蘭曆就是一種陰曆。第三個辦法是要同時兼顧朔望月和回歸年,年和月按特定的規律編排,使一個月的平均週期接近朔望月,一年的平均週期接近回歸年,這樣的曆法稱為「陰陽合曆」,簡稱「陰陽曆」,農曆就是一種陰陽曆。

農曆規定把朔(即新月)落在的那一日定為某月初一。朔望月的平均值是29.5306日,所以農曆一個月可以有二十九日,稱為小月,也可以有三十日,稱為大月。月大月小是根據兩朔日之間的日數而定。回歸年的週期是365.2422日,是朔望月平均值的12.37倍,所以農曆一年一般有十二個月。為使農曆不偏離回歸年的週期,約每三年需有一個「閏月」,即一年有十三個月。

安置閏月以使農曆一年平均週期接近回歸年,即「置閏法則」,是農曆要解決的重要問題。歷代用過很多不同的置閏法則,有過五次重大的曆法改革,最近一次重大改革發生在清順治二年(公元1645年)。這裡只談現在通用農曆的法則,談法則之前須先闡釋對編算農曆來說重要的天文和曆法概念。


重 要 概 念

要深入了解現代農曆的編算,得從現代的時間計量說起。


UT1, UTC, 中 國 標 準 時

世界時(UT)是根據地球自轉制定的時間。世界時有幾種不同版本,最常用的是UT1和協調世界時(UTC)。UT1是先根據地球上某一特定的經線註二相對於遙遠恆星的方位,再通過簡單變換得出符合平均太陽時的時間標準。地球自轉不均勻,所以UT1的時間也不均勻,這使UT1在應用上有所不便,於是人們創立協調世界時UTC來取代UT1。

協調世界時UTC是由國際原子時TAI及UT1而定。國際原子時是根據遍布世界上超過五十個國家、超過四百臺原子鐘的時刻經過數據處理而定的時刻,由TAI所定的每一秒鐘都是均勻的。UTC則定為TAI加上整數秒,使之與UT1的偏差不超過0.9秒。所以UTC的一秒和TAI的一秒時間間隔完全一樣,當UTC與UT1的時刻相差快要超過0.9秒時,閏秒便會加到UTC上,閏秒可正可負,正閏秒的一分鐘有六十一秒,負閏秒的一分鐘只有五十九秒。到目前(2024年1月)為止的閏秒全是正閏秒。閏秒法則從1972年實施,到目前為止總共加了二十七個閏秒,上一次閏秒是在2016年12月31日23時59分60秒UTC。所以UTC在大多數的時候是均勻的,只是在加閏秒時會有一秒的突變,這些突變有時會造成混亂,因此UTC政策在2035年或更早會有重大調正。CGPM27

區時定為與協調世界時UTC相差某個特定的時間,是世界各國採用的時間系統。現在中國各地採用的時間是東八區的區時,與UTC數字上相差八小時(例如東八區9:00相當於 UTC 1:00 ),一般以UTC+8表示,也稱為北京時間或中國標準時。現在的農曆就是以UTC+8為時間基礎。


農 曆 的 紀 年、紀 月 和 紀 日 法

農曆現在以干支紀年。月份以正月、二月、三月……十二月表示,閏月取前一個月的月數在前面加上「閏」字,如閏三月、閏九月等。農曆每月第一日到第十日依次紀為初一、初二……初十,第十一日到第二十日依次紀為十一、十二……二十,第二十一日到第二十九日依次紀為二十一、二十二……二十九,或者簡紀為廿一、廿二……廿九,第三十日紀為三十。農曆也可用干支來紀日期,但月份一般不用干支。

眾所週知,以前中國常以帝王年號紀年,這種紀年方法到清朝滅亡後廢除。中華民國雖然用「民國」紀年,但民國紀的是公曆年而非農曆年,例如民國元年是指公元1912年,不是農曆壬子年。


朔是指月亮與太陽在同一方向的時刻,這說法過於籠統,現代天文學把朔定義為月球地心視黃經λM與太陽地心視黃經λS相等的時刻。與朔相關的概念有上弦、望和下弦。上弦是λM-λS=90°的時刻;望是λM-λS=180°的時刻;下弦是λM-λS=270°的時刻。籠統地說,上弦是月亮位於太陽以東90°的時候;望是月亮在太陽的相反方向的時候;下弦是月亮位於太陽以西90°的時候。

朔所在的日期稱為朔日。中國一直以來以午夜零時(古時稱子正)作為一天的開始,所以不論朔發生在某天的00:00:00或23:59:59.999,朔日仍視為同一天。值得注意的是現在農曆以UTC+8為時間基礎,例如朔曾發生在公元2010年12月5日UTC17:36,換成UTC+8區時,這次朔發生在2010年12月6日的01:36,所以這次朔日是在2010年12月6日。

農曆有一條古老法則一直沿用至今:朔日定為某月的初一日。所以2010年12月6日必是某月的初一日,下面要說的另一法則把此朔日定為十一月初一。下一個朔日發生在公元2011年1月4日,所以下一個月的初一是2011年1月4日。2010年12月6日和2011年1月4日之間有二十九日,由此推出這個十一月是小月。


中 氣 和 歲

二十四節氣網頁所述,中國古代用二十四節氣來表示太陽在黃道的位置。二十四節氣又分為十二個中氣和十二個節氣:自立春算起,單數的稱為節氣,雙數的稱為中氣。現代天文把中氣定義為太陽的地心視黃經達到30°的整數倍的時刻。

冬至是其中一個中氣,在農曆編算中相當重要。如六十干支網頁所述,冬至所在的月份定為建子。自漢武帝太初元年(即公元前104年)以來的歷代各朝一般以建寅為正月,所以建子是十一月,由此可知含冬至的月份必定是農曆十一月。例如2010年的冬至時刻是12月22日07:38(UTC+8),上面提到2010年12月6日和2011年1月4日皆是朔日,故此以2010年12月6日為初一的月份含有冬至,所以是該月是十一月。

二十四節氣網頁又指出「歲」與「年」在農曆是嚴格分開的。一歲是指從冬至到下一個冬至的時間。「歲」又可以指從建子月的初一日到下一個建子月之前的一日,即由十一月初一到下一個十一月初一前一日那段時間。一歲有十二或十三個月。為方便起見,這裡稱含十二個月的歲為「平歲」,稱含十三個月的歲為「閏歲」。農曆有一條重要法則:在閏歲的十三個月中,其中的一個月要定為閏月。

平歲的月份編排很簡單。如前所述,含冬至的那個月定為十一月,以後的十一個月依次定為十二月、正月、二月……十月。所以在平歲中正月是十一月(建子)後的第二個月,正月初一是冬至日後的第二個朔日。

閏歲的情況稍為複雜。一歲有十二個中氣,閏歲有十三個月,所以至少有一個月不含中氣,農曆規定冬至後第一個不含中氣的月份定為閏月。為方便起見,這裡且稱非閏月的月份為「平月」。在閏歲中含冬至的月份定為十一月,其餘十一個平月依次定為十二月、正月、二月……十月,閏月取前一個月的月數在前面加上「閏」字。在閏歲中正月是十一月以後的第二個平月。


現 代 農 曆 的 編 算 法 則

重要概念都說完了,現在要總結現代農曆的編算法則。下面列出的法則是根據中華人民共和國國家質量監督檢驗檢疫總局和中國國家標準化管理委員會聯合發佈的《農曆的編算和頒行》文件国标(編號GB/T 33661-2017),這文件是2017年5月由中國科學院紫金山天文臺擬定。以下用《國標》簡稱這文件。

除了法則一和法則五外,其他法則基本上是繼承古制。法則四和法則六其實就是「含冬至之月為建子,以建寅為正月」的另一寫法,這寫法取自《國標》,顯然是為了避談月建,卻不免使不熟識中國曆法者感到有點莫名其妙。法則五是順治二年(1645年)曆法改革時制定的,稍為修改了之前的「無中氣」置閏法則。法則一是1928年才加上的。

現在,法則一其實是說算農曆時應用UTC+8作為標準時。但是UTC在1960年制定,經過多次修改,到1972年才定下來。為了避免混亂,本網站所列的時間在1972年以前是UT1+8,從1972年起才用UTC+8。這其實幾乎沒有什麼關係,本網站列出的時間只列到分鐘,UT1和UTC在1960年和1971年間最多只有幾秒之差。

法則一到1929年起才實施,1929年前的時間以北京地方時為準,北京的經度是116°25',與東經120°標準時相差約十四分鐘。如果朔或節氣時刻接近午夜零時,十四分鐘之差可以使朔日或節氣之日有一日之差。例如有朔發生在公元1916年2月4日0:05(UT1+8),按北京地方時這朔發生在2月4日午夜前,所以朔日是2月3日,這朔日正好是農曆丙辰年的正月初一,所以中國在1916年2月3日慶祝農曆新年,而不是2月4日。

從上述法則可制定編算農曆的方法,下面列出的方法可用來編定一歲內的所有農曆月,即從某年十一月到下一年十月的所有農曆月日。為方便起見,以下用NY表示年首最接近公曆Y年1月1日的農曆年,例如N1984指農曆甲子年,始於公元1984年2月2日,終於1985年2月19日。用WY表示落在公曆Y年的冬至日期,SY則表示從NY-1的建子月到NY建子月之前一日的那段時間,即農曆的歲。

  1. 計算兩冬至的日期WY-1WY

  2. 計算在WY-1或之前的第一個朔日M-1和在WY或之前的第一個朔日M11

  3. 求從M-1M11之間的朔的數目LY(包括M-1但不包括M11),LY是最接近(M11 - M-1)/29.53的整數。

    1. 如果LY=12,則SY是平歲。計算M-1之後的十一個朔日,依次標以M0,M1,……,M10

    2. 如果LY=13,則SY是閏歲。計算M-1之後的十二個朔日及在SY內的所有中氣日期,然後找出最先出現不含中氣的月份,這個月份便是閏月。把平月的朔日日期依次標以M0,M1,……,M10,閏月的朔日日期則標以M*i,這裡i是閏月之前那個月的編號。

  4. M-1是農曆年NY-1的十一月初一,M0是十二月初一,M1是農曆年NY的正月初一,M2,……,M10是農曆年NY的二月初一,……,十月初一。如果有閏月,閏月的初一是M*i

上述程序定出從農曆年NY-1的十一月到農曆年NY十月的月日編排,如想推算農曆年NY的其餘月份,就要重複以上步驟來計算下一個歲SY+1的農曆月份。


農 曆 編 算 例 子
農 曆 法 則 之 疑 惑
《農 曆 的 編 算 和 頒 行》: 2017 年 國 家 標 準 (GB/T 33661-2017)

上面說到2017年5月中國科學院紫金山天文臺擬定了《農曆的編算和頒行》文件国标(編號GB/T 33661-2017),由中華人民共和國國家質量監督檢驗檢疫總局和中國國家標準化管理委員會聯合發佈。這《國標》文件的出現,應該和下面的歷史有關。

多年來,《萬年曆》在民間很流行。據中國科學院紫金山天文臺編的《新编万年历(修定本)》新编万年历和劉寶琳編的《100年袖珍干支月曆》劉寶琳所述,《萬年曆》是由清朝欽天監所編,正式書名是《御定萬年書》。第一部《萬年曆》在乾隆年間編成,年限是從清太祖天命九年(公元1624年,清朝入關前的第一個甲子年)到「乾隆一百年」(公元1835年)。乾隆五十二年(公元1787年)又編了一部《萬年曆》,把年限延長至「乾隆二百年」(公元1935年)。乾隆以後,凡新皇帝即位都會重編《萬年曆》,把年限延長至新皇帝年號的第二百年。所以《萬年曆》在嘉慶四年(公元1799年)、道光四年(公元1824年)、咸豐元年(公元1851年)、同治元年(公元1862年)、光緒二年(公元1876年)都有續修。最後一部《萬年曆》在宣統二年(公元1910年)編成,年限延長至「宣統二百年」(公元2108年)。

《萬年曆》雖然預推二百年的日曆,可是清政府每年頒行的曆書《大清時憲書》不根據《萬年曆》,《大清時憲書》有時會修正《萬年曆》的預推。例如嘉慶《萬年曆》預推嘉慶四十六年(實際是道光二十一年)十一月大、十二月小,十二月初一的日干支是辛巳(公元1842年1月12日),而《大清道光二十一年時憲書》改為十一月小、十二月大,十二月初一的日干支是庚辰(公元1842年1月11日);道光《萬年曆》預推道光三十六年(實際是咸豐六年)十月小、十一月大,十一月初一的日干支是甲寅(公元1856年11月27日),而《大清咸豐六年時憲書》改為十月大、十一月小,十一月初一的日干支是乙卯(公元1856年11月28日);同治《萬年曆》預推同治二十九年(實際是光緒十六年)六月小、七月大,七月初一的日干支是戊辰(公元1890年8月15日),而《大清光緒十六年時憲書》改為六月大、七月小,七月初一的日干支是己巳(公元1890年8月16日)。這樣的例子還有不少,說明《萬年曆》即使在清朝也不是正式採用。根據劉寶琳和Richard Stephenson的文章,[Liu-Stephenson98]《萬年曆》與《大清時憲書》的曆日差異是因為《萬年曆》顯然用了簡略算法計算日曆,當合朔時刻接近夜半零時,用簡略算法算出的朔日或會落在錯誤的日期。

公元1912年中華民國成立,宣佈改用公曆,但是農曆仍在民間流行。於是中國有兩個新年,民間對公曆新年反應冷淡,到了農曆新年卻非常熱鬧,當時有「民國的新年」和「國民的新年」說法。北洋政府頒行的《中華民國曆書》除了登載公曆外,仍然登載農曆。到了1929年,南京國民政府試圖禁止農曆在民間使用,國民政府頒行的《國民曆》不再登載農曆。但是人民已習慣了使用農曆,而且傳統習俗和節日都依據農曆,所以禁令難以實行。1934年,國民政府無奈表示「對於舊曆年關,除公務機關,民間習俗不宜過於干涉」,停止了強制廢除農曆。

由於政府不再頒行「官方農曆」,在民間流行的農曆有時會出現不同版本。1953年,中國大陸出現了兩種不同的日曆,一種根據宣統《萬年曆》載農曆六月小、七月大(七月初一在8月9日),另一種根據紫金山天文臺的資料載農曆六月大、七月小(七月初一在8月10日)。自此以後,內地出版的日曆大都根據紫金山天文臺的資料,而不再用《萬年曆》了。到了1978年在香港和廣州等地出現了兩種版本的農曆。根據紫金山天文臺編的農曆該年的八月初一在公曆9月3日(合朔時刻是00:09(UTC+8)),而香港和從香港運到廣州等地的一些日曆根據宣統《萬年曆》載八月初一在公曆9月2日,導致兩種版本的中秋節日期有一日差異。這朔日差異主要是由於宣統《萬年曆》計算的時間是根據北京的地方視時,推算的合朔時刻在9月3日零時之前數分鐘。從此以後,香港和內地都採用紫金山天文臺編的農曆。在1989年又出現了宣統《萬年曆》與紫金山天文臺對農曆七月初一的日期差異,此時香港與內地一致採用紫金山天文臺的資料,但在臺灣卻不然。經臺灣權威機構證實紫金山天文臺的數據正確後,臺灣出版的大量錯誤日曆遭收回。

《國標》的訂立,就是為了杜絕這些不同版本的農曆帶來的混亂。《國標》文件列出的農曆編算法則與順治二年(1645年)曆法改革所定的法則基本上一致,《國標》主要是用現代天文學嚴格定義曆算中涉及的天文學概念,比較專門的概念不便在文件中詳細說明,所以說要依照國際地球自轉和參考系服務規範(IERS Conventions)發佈的文件來詮釋那些專門概念。文件也規定朔和二十四節氣時刻計算精度應達到一秒(不計及編算時尚未正式公佈的閏秒),1912年至《國標》生效之日期(2017年9月1日)間的農曆日曆應參考紫金山天文臺編算的農曆。中國科學院會提前一年正式發佈農曆日曆的年度標準資料,所以農曆又有了「官方版」。《國標》主要目的是以現代天文學概念規範農曆的編算方法,訂立國家標準,杜絕錯誤的農曆經輾轉複製發行而給社會帶來混亂。

我認為訂立編算農曆國家標準是好事,但對其中的一秒計算精度要求感到困惑。編算曆法根本不需要把朔和節氣時間算到一秒,除非朔和節氣時間離午夜零時小於一秒,但這樣的情況絕少出現。要達到一秒精度要求,必須把太陽和月球的位置計算得很準確。太陽的平黃經在一回歸年增加360°,所以在一秒鐘的時間,太陽的視黃經平均來說增加360°/(365.2422×86400)=0.04"(即0.04弧秒)。所以要把二十四節氣的時刻算準到一秒,必須把太陽的視黃經算準到0.04"。同理,要把合朔時刻算準到一秒,月球的視黃經必須計算準到360°/(29.5306×86400)=0.5"。世界上預先編算的太陽和月球位置曆表,或許要到1970年代末才達到這樣的精度。另外,必須嚴格定義「視黃經」來配合這個精度要求,所以《國標》明確規定必須按國際地球自轉和參考系服務規範(IERS Conventions)定義的天球座標來計算太陽和月球的視黃經。

如前述,高精度的合朔和節氣時刻只有在少數情況下,當這些時刻接近午夜零時時才有必要。但是這些情況要在數十年後才會出現,而且現在對這些情況暫時無能為力,原因是現在不能把數十年後的合朔和節氣的UTC+8時刻很準確地算出。現代的準確曆表大多以質心力學時(barycentric dynamical time)TDB為時間標準。TDB是用廣義相對論來定義的均勻時間,用來計算月球和太陽系行星的位置。編算農曆要用UTC+8時間,所以必須把TDB轉化為UTC+8。這可先把TDB轉化為地球時(terrestrial time)TT,然後再把TT轉化為UTC+8。TDB與TT的轉換可用廣義相對論的變換公式計算,但是TDB與TT在數千年來的差異不大於二毫秒(即0.002秒),所以在編算曆法時可省略這一步,即把TDB與TT視為等同。而TT與國際原子時TAI有簡單的關係: TT=TAI+32.184秒,上面說過TAI和UTC相差整數秒,確實的秒差涉及到究竟有多少閏秒加到UTC上。所以要把TDB化為UTC+8,就要知道閏秒的數目,但是地球自轉不均勻,數十年後的閏秒數目難以準確預測。所以雖然現代的高精度曆表能把數十年後的合朔和節氣的TDB時刻計算得很準,但是其對應的UTC+8時刻還是不能準確算出。因此我們對數十年後接近午夜零時的合朔和二十四節氣日期暫時無能為力。面對這些少數的合朔和節氣,我認為最佳的處理方法是承認現在無法斷定這些合朔和節氣的日期,確實日期與現在推算的日期或會有一日之差。本網站就是用這樣的方法處理這些少數的合朔和節氣。

合朔和節氣時刻接近午夜零時的情況以前當然也曾發生,以前對合朔和節氣的定義沒有現在那麼精確,計算方法也沒有現在那麼準,而且在1929年以前的時刻也不用東經120°的標準時。所以用現在的方法計算以前的合朔和節氣日期有時與當時的計算結果不一致,而算出的農曆也可能與以前通行的日曆不一致。遇到這些情況時,應以當時政府頒行的日曆為準。本網站所列的月相和節氣時刻都是根據現代方法計算,但是歷代的農曆日期依照當時政府頒行的曆法。至於二十四節氣的日期,年曆網頁中在公元1733年以前列出以當時曆法計算的日期,稱為「曆書節氣」,1733年以後的曆書節氣根本上與現代計算的一致,所以略去不註,只有遇到與當時的曆書有不一致時才會用紅色字形註明。



備 註 和 參 考 文 獻