古 六 曆 的 計 算 方 法

初稿: 2019年3月


本網站的古六曆資料是參考張培瑜、陳美東、薄樹人和胡鐵珠著的《中国古代历法》張陳薄胡書中第三章第六節。該書的前言說書中各章節由四人分別執筆,第三章由張培瑜撰寫。張培瑜是中國科學院紫金山天文臺的研究員。本網站的計算方法不依書中所述的方法,而是採用一套方便編寫計算機程式的方法,計算結果和張培瑜著的《中国先秦史历表》張培瑜87和《三千五百年历日天象》張培瑜97所載曆日數據一致。下面會詳細介紹具體的計算方法。


內容

  1. 四 分 術 的 朔 策 和 歲 實
  2. 六 曆 的 曆 元
  3. 合 朔 和 節 氣 計 算
  4. 月 建 和 月 序
  5. 置 閏 法 則
    1. 閏 餘 法
    2. 固 定 冬 至 法
    3. 無 中 氣 法
  6. 六 曆 算 例
  7. 用 十 進 制 小 數 計 算 古 六 曆
   備 註 和 參 考 文 獻

四 分 術 的 朔 策 和 歲 實

古六曆是指周曆、魯曆、殷曆、夏曆、黃帝曆和顓頊曆這六部曆法,六曆的計算都是用四分術。四分術的名稱緣於其歲實(即回歸年)取三百六十五又四分之一日(即365.25日),朔策(即朔望月)取歲實的19/235,即
朔策 = (365 + 1/4)日×19/235 = (29 + 499/940)日 = 29.530851064日。
這樣做的目的是要使235個朔望月等於19個回歸年。由於235=19×12+7,在十九年裡加七個閏月就能使曆法一年的平均值等於四分術採用的歲實了。所以古六曆的六部曆法全是採用十九年七閏法。六曆不同之處是所選的曆元不同。

曆元在這裡是指曆法的起算點,一般是指定某一日某二十四節氣(通常是冬至)與合朔發生在同一時刻(通常是夜半,即午夜零時),稱之為某節氣合朔齊同。註一

以周曆為例,周曆的曆元是指定冬至與朔發生在某甲子日的夜半,即冬至合朔齊同。唐朝以前的曆法以平朔法計算合朔時刻、以平氣法計算節氣時刻,即假設月亮和太陽以均勻速度在天空運行。四分術的歲實=365.25日=(12+7/19)朔策,根據規定在曆元時冬至與合朔發生在同一時刻,下一年的冬至便在(12+7/19)個朔望月後,這時冬至與合朔就不齊同了,冬至離之前最接近的合朔有7/19個朔望月(即10.88日),這7/19稱為「閏餘」。

一般而言,閏餘定為某一特定節氣(通常是冬至)的月齡,即該節氣離之前合朔的時間間隔(月齡可以用日計,也可以用朔策的分數倍表示,此處用朔策的分數倍表示)。所以閏餘在曆元是0,一年後是7/19,容易看出下一年的閏餘是這年閏餘加上7/19,如果加後超過1,就要減去1。依這法則可算出閏餘從曆元算起的頭十九年是(略去分母19):0、7、14、2、9、16、4、11、18、6、13、1、8、15、3、10、17、5、12,到了第二十年,閏餘又回復到0,即冬至與合朔又齊同了,由此可知閏餘有十九年的週期。十九年稱為一「章」。

一章後雖然冬至與合朔又發生在同一時刻,但這時刻不在夜半,因為365.25×19=6939.75,用現在的時間系統來說,冬至與合朔這時發生在18時,要到四章(76年)後冬至與合朔才會又同時發生在夜半,四章稱為一「蔀」。一蔀後雖然冬至和合朔又同時在夜半,但是365.25日×76=27759日,而27759不是60的倍數,所以一蔀後的日干支不是甲子,而是癸未,要到二十蔀(1520年)後才可回復到甲子日冬至和合朔同在夜半,二十蔀稱為一「紀」。但是一紀是1520年而1520不是60的倍數,所以一紀後年的干支與曆元時不同,要到三紀(4560年)後才可回復與曆元相同的年干支,三紀稱為一「元」。以下總結四分術的法數。

歲實: 1歲 = (365+1/4)日 = (12+7/19)月
朔策: 1月 = (29 + 499/940)日
章: 19歲 = 235月 = (6939+3/4)日
蔀: 4章 = 76歲 = 940月 = 27759日
紀: 20蔀 = 1520歲 = 18800月 = 555180日
元: 3紀 = 4560歲 = 56400月 = 1665540日


六 曆 的 曆 元

古六曆在戰國時期創制行用,但是當時的曆法已經散失,今天我們可從後來的史藉例如《漢書》、《續漢書》等得知古六曆的資料,可是兩部書都沒有記載六曆的曆元。直到《開元占經》才給出六曆離開元二年(公元714年)的上元積年。所謂上元,是一個理想的曆元,其時日月合璧、五星連珠。日月合璧是指太陽和月亮的經度相同,五星連珠是指水、金、火、木、土五行星同時出現在天空同一方的現象,清朝欽天監規定「連珠」指五行星的經度相差小於45度。下表列出《開元占經》的上元積年數據。

表 一: 古 六 曆 的 上 元 積 年 數 據
曆法上元積年上元的公曆年曆元日干支、 氣朔關係
黃帝曆2760863-2760149甲子日夜半冬至合朔齊同
殷曆2761080-2760336
周曆2761137-2760423
夏曆2760589-2759875夏曆有兩個版本,其一是甲子日夜半冬至合朔齊同,
另一是甲子日夜半雨水合朔齊同。
顓頊曆2761019-2760305己巳日夜半立春合朔齊同
魯曆2761514*-2760800甲子日夜半冬至閏餘一

* 《開元占經》給出的魯曆上元積年是2761334,歷代多位學者已發現這數字不正確。表中列出的上元積年是根據張培瑜的推算。


表中「甲子日夜半冬至合朔齊同」又作「甲子朔旦冬至」,是指冬至和合朔同時發生在甲子日的夜半(午夜零時)、「甲子日夜半雨水合朔齊同」或「甲子朔旦雨水」,指雨水和合朔同時發生在甲子日的夜半、「己巳日夜半立春合朔齊同」或「己巳朔旦立春」,指立春和合朔同時發生在己巳日的夜半。上表指出夏曆有兩個版本,這裡稱冬至合朔齊同為「冬至版」,稱雨水合朔齊同為「雨水版」。

魯曆的情況較為特殊。首先,歷代多位學者已指出《開元占經》列出的魯曆上元積年不正確,表一的數據是根據張培瑜的推算。此外,《漢書‧律曆志上》說:「魯曆不正,以閏餘一之歲為蔀首。」意思是說魯曆的曆元和其他五曆不同,不是以某節氣與合朔齊同,而是以閏餘一為曆元。「閏餘一」其實是閏餘是1/19的簡略說法。魯曆的曆元是冬至發生在甲子日夜半,但是其時冬至的月齡是1/19,所以合朔在甲子日夜半之前1/19個朔策(即1.554日前)。嚴格來說,魯曆的曆元不符合上元的要求,因為當時並非日月合璧。某節氣與合朔齊同時,該節氣的月齡是0,又稱「閏餘無」。所以除魯曆外,其他五曆的曆元都取閏餘無。

上元的概念由西漢未年的劉歆提出,推算上元是十分繁瑣的同餘算數問題。由於日月合璧、五星連珠十分罕見,上元離曆法使用的時間(即上元積年)非常遙遠,例如南宋李德卿所制《淳祐曆》(1250年)取上元積年數為「一億二千二十六萬七千六百七十七」! 積年數大使天文計算十分不便。還有一個弊病是上元算法存在嚴重的附會情況:上元推算十分繁瑣,計算時需要簡化,天文常數往往以實測為參照,然後調整數據來配合算出的上元。上元積年的推算從元朝《授時曆》起廢除,曆法計算直接用實測數據。關於上元積年的推算,這裡另有專文論述。

《開元占經》載的古六曆上元積年,應是東漢時推算附加的,不是戰國時採用的曆元。用上元為曆元計算古六曆不方便,應當選取較接近戰國時代的曆元。從上一節可知,四分術以一紀1520年為日干支、節氣合朔夜半齊同的週期,把上元加上1520年的整數倍後得出的曆元依然是同一日干支的節氣合朔夜半齊同。這裡以周曆為例,《開元占經》列出的周曆上元相當於公元-2760423年,把這年數加上1520×1816=2760320後得出-103年,即公元前104年。所以公元前104年的甲子日夜半冬至合朔齊同也可作為周曆的曆元,這比-2760423年方便得多。有一點要注意,中國曆法是陰陽合曆,「陰」的部份跟從月相,「陽」的部份跟從太陽,以冬至作為「陽」的歲首。公元前104年的甲子日冬至其實是最接近公元前104年1月1日的冬至,我們知道這在公元前105年的12月末。只要找出公元前105年的12月末的甲子日便知周曆的曆元,計算得出的甲子日落在公元前105年的12月25日。

曆元的選取當然不一定總是要求日干支與上元時相同,把曆元加上蔀(76年)的整數倍後,得到的年份依然是節氣與合朔與上元有相同關係。以周曆為例,把-103年減去76年的三倍得到-331年。也就是說周曆在前332年冬至和合朔同在夜半,但是76年×3=228年=83277日,不是60日的倍數,故前332年的曆元日干支不是甲子,而是甲子日之前83277日,用同餘算術可算出是丁卯日。前332年丁卯冬至在前333年12月25日,其時周曆的冬至和朔同時在夜半。前104年和前332年都可稱為周曆的「蔀首」,蔀可用日干支為名,例如前104年是周曆的甲子蔀首、前332年是丁卯蔀首。某年與蔀首的積年加一稱為該年的「入蔀年」,例如前331年入周曆丁卯蔀二年。


合 朔 和 節 氣 計 算

古六曆的六部曆法各有不同的曆元,也就是說六曆有不同的曆法起算點,這在編寫計算機程式上不方便。這裡介紹一個統一方法計算古六曆。

這方法是用儒略日數計算合朔和節氣時刻。儒略日數是從公元前4713年1月1日正午起算的日數,用儒點日數就是把六曆的時間起算點統一在公元前4713年1月1日正午。以周曆為例,上節說根據周曆曆法,公元前105年12月25日冬至和合朔同時發生在夜半,公元前105年12月25日夜半的儒略日數是1683430.5。根據平朔和平氣法,周曆的冬至和合朔時刻的儒略日數可用以下公式計算。
JD(Mi) =1683430.5 + i·PL
JD(W(y)) = 1683430.5 +(y+103)·Ps
這裡PL=(29+499/940)日是四分術的朔策,Ps=365.25日是四分術的歲實。Mi指從公元前105年12月25日合朔算起的第i個合朔;W(y)是最接近公曆y年1月1日的冬至,在戰國時代總是發生在公元y-1年的12月末。

古六曆其他曆法的冬至和合朔時刻也可以用類此公式計算:
JD(Mi) = JD(M0) + i·PL                        (1)
JD(W(y)) = JD(W(y0)) + (y-y0)·Ps           (2)
這裡i指從曆元合朔M0算起的積月,JD(M0) 、JD(W(y0)) 和y0的數值由下表給出。計算冬至的公式中,可以把JD(W(y0))和y0結合成另一參數:
JDW=JD(W(y0)) - y0·Ps           (3)
冬至的公式便可簡化成
JD(W(y)) = JDW + y·Ps           (4)
下表把參數JDW列在最後一欄。

表 二: 計 算 古 六 曆 合 朔 和 冬 至 的 參 數
曆法JD(M0)JD(W(y0))y0JDW
黃帝曆1783510.51783510.51711721052.5 + 1/4
殷曆1704250.51704250.5-461721051.5 + 1/2
周曆1683430.51683430.5-1031721050.5 + 3/4
夏曆(冬至版)1883590.51883590.54451721053.5 + 3/4
夏曆(雨水版)1883650.51883589.5 + 1/84451721052.5 + 7/8
顓頊曆1726575.51726529.5 + 11/32151721050.5 + 19/32
魯曆1545728.5 + 419/9401545730.5-4801721050.5

這些參數的計算方法是首先把上元的年份加上一紀(1520年)的整數倍使之接近戰國時代的年份,這樣便得到y0,然後找出對應曆元日干支的公曆日期。日干支以六十日為週期,因為我們知道節氣的大約公曆日期(冬至:12月末、立春:2月初、雨水:2月末),所以不難找到曆元日干支的公曆日期,最後把公曆日期轉化為儒略日數。

黃帝曆、殷曆、周曆和冬至版夏曆的曆元都是夜半冬至合朔齊同,所以JD(M0)=JD(W(y0))。雨水版夏曆以雨水合朔齊同為曆元,而雨水是冬至後第四個二十四節氣,根據平氣法,冬至在雨水之前(4/24)個歲實=60.875日,所以JD(W(y0))=JD(M0)-60.875。顓頊曆以立春合朔齊同為曆元,立春是冬至後第三個節氣,冬至在立春之前(3/24)個歲實=(45+21/32)日,所以JD(W(y0))=JD(M0)-(45+21/32)。魯曆以冬至閏餘一為曆元,所以JD(M0)=JD(W(y0))-(1/19)×(29+499/940)。

我們雖然不知道戰國時代是不是已經創立了全部二十四節氣,但是仍可用平朔法把歲實分成二十四等份計算從公元y-1年冬至算起的各節氣儒略日數:
JDq(j,y) = JD(W(y)) + (j/24)·Ps          (5)
這裡j是從冬至算起的節氣數,以j=0表示冬至、j=1表示小寒、j=2表示大寒、j=3表示立春……j=23表示大雪(二十四節氣的名稱和次序可參閱本網站的二十四節氣網頁)。公式(5)中除了冬至落在y-1年的12月末外,其餘節氣都在公元y年。

用儒略日數的好處是已有標準方法把儒略日數轉換成公曆日期,本網站的干支網頁也有用儒略日數計算日干支的公式。

公式(1)、(4)和(5)也有助我們對古六曆的了解。六曆都採用平朔和平氣法,所以合朔時刻是某常數加上朔策的整數倍,節氣時刻是某常數加上歲實/24的整數倍。六曆都採用四分術,所以朔策PL和歲實Ps的數值相同。六曆之不同,在於參數JD(M0)和JDW取不同的數值而已,當然,這說法等同於「六曆的曆元不同,曆元氣朔的關係也不盡相同」。

四分術歲實365.25日和儒略曆相同,比回歸年大0.0078日,累積128年會有一日偏差。朔策(29+499/940)日比朔望月的平均值大0.000268日,累積3730月(約三百年)會有一日偏差。六曆所取的參數不同,除了觀測數據可能有差異外,很可能還與曆法制定的時間不同有關。下圖顯示曆法合朔和實際合朔之差,圖中所見之波動是因為用平朔法計算合朔只計及 月亮和太陽的平均運動。除了波動外可明顯看出時間差異平穩增長,和預期的結果一致。兩合朔時刻之差的平均值可以取數個波動之平均值而得,更方便的方法是用線性回歸法擬合數據而求得一直線。我們知道兩朔時刻之差的增長是因為四分術的 朔策比朔望月的平均值稍長而造成的,時刻差異是時間的線性函數,所以用線性回歸是恰當的。曆法之朔早於實際合朔稱為「先天」,遲於實際合朔稱為「後天」。從下圖可見周曆、黃帝曆和冬至版夏曆在整個戰國時代大多數時間是先天的,而其餘曆法有某一年份最為合天,該年份以前大多先天,該年份以後則大多後天。雨水版夏曆在公元前460年左右最為合天,魯曆在前450年左右最為合天,殷曆在前435年左右最為合天,顓頊曆在前335年左右最為合天。

周曆、黃帝曆、殷曆、魯曆: 曆法後天日數
顓頊曆、夏曆: 曆法後天日數
圖: 曆法合朔和實際合朔之差。此處JD是實際合朔的儒略日數,y可視為合朔時刻以公曆年表示,縱軸是曆法合朔時刻減去實際合朔時刻所得的日數註二,負數表示曆法合朔在實際合朔之前(先天)。藍色橫線表示曆法之朔和實際之朔相同(曆法合天),紅線是用線性回歸擬合數據所得之直線,代表兩合朔時刻之差的平均值。垂直破折線顯示曆法最合天的年份,位於紅線和藍色橫線的相交點,這年份在殷曆是-434年、在魯曆是-449年、在顓頊曆是-336年、在雨水版夏曆是-460年。

月 建 和 月 序

周曆、魯曆、黃帝曆都以建子(即含冬至的月份,現在的十一月)為年首,兩個版本的夏曆都以建寅(現在的正月)為年首,殷曆以建丑(現在的十二月)為年首註三,顓頊曆則以建亥(現在的十月)為年首。除了顓頊曆外,各曆法的月序都是正月、二月、三月……十二月。閏月的情況下一節再說。由於月建不同,夏曆的正月往往在周、魯、黃帝曆的正月之後兩個月。顓頊曆的月序比較特別,起始月不稱正月而是依夏曆稱建亥為十月,顓頊曆的月序是十月、十一月、十二月、正月、二月……九月。


置 閏 法 則

目前學界對於古六曆的置閏法則未有一致意見,對於閏月位置也沒有一致意見。置閏方法有三種說法:閏餘法、固定冬至法和無中氣法;閏月位置有人主張置於年終,稱為閏月而不用註明閏幾月,但也有人主張可以在年中置閏。對於顓頊曆的閏月位置,因為有較多的資料爭議比較少,一般認為閏月置於年終,稱為後九月。

下面三小節簡單介紹閏餘法、固定冬至法和無中氣法。無中氣法的規則必然會出現年中閏月,固定冬至法一般把閏月置於年終,閏餘法卻沒有指明一定要在年終或年中置閏。本網站的的年曆網頁朔閏表網頁計算古六曆時效法張培瑜著的《中国先秦史历表》張培瑜87和《三千五百年历日天象》張培瑜97,採用固定冬至法並把閏月置於年終,但也有註明無中氣的月份以供參考。


閏 餘 法

周曆和黃帝曆都以建子含冬至的月份為年首,也都以冬至合朔齊同作為蔀首,這裡就先以這兩部曆法為例說明閏餘法。

四分術的歲實=(12+7/19)朔策,如上所述,閏餘在一年後增加7/19,如果超過一,則把一減去。二曆在蔀首的第一年閏餘是0,即冬至在正月初一夜半,下一年冬至在一個歲實後,在12個月後加7/19朔策,閏餘是7/19,如果沒有閏月,冬至在正月十二。再過一年後,閏餘是14/19,如果沒有閏月,冬至在正月廿三。14/19加上7/19超過一,意味著下一年的冬至在這一年的正月後十三個月,假如這一年還是不閏,下一年冬至便會在二月,而正月不含冬至,月建不再是建子了。所以為了使正月的月建是建子,第三年必須有閏月,使冬至在第四年仍在正月,閏餘是2/19。不難看出,如果某年的閏餘加上7/19後達到或超出一,該年必須有閏月才能使正月月建保持在建子。所以閏餘法的置閏法則是:在冬至的月齡達到或超過12/19的年份加插閏月。由入蔀年的第一年閏餘零起算,閏餘在本文第一節「四分術的朔策和歲實」已一一列出,從中可見須要置閏的年份是第三、六、九、十一、十四、十七和十九年。到了第二十年,閏餘回復到零,所以閏月有十九年的週期,即章週。這閏餘法得到的閏年規律是3-3-3-2-3-3-2,意思是閏月出現在第三年,然後是第六(=3+3)年,然後是第九(=3+3+3)年,然後是第十一(=3+3+3+2)年等等。

魯曆同樣以建子為正月,只是以閏餘一為蔀首,從本文第一節「四分術的朔策和歲實」的閏餘數值可見,這其實是把章週的起算年放在以閏餘無為蔀首的第十一年,所以有閏月的年份變成第三、六、八、十一、十四、十七和十九年。

其餘三曆不以建子為年首,置閏法則可修改為:在冬至的月齡達到或超過12/19之歲加插閏月。此處「歲」是指從建子月初一日到下一個建子月之前一日的那段時間。「歲」與「年」在周曆、黃帝曆和魯曆是相同的。這置閏法則會使冬至在殷曆固定在十二月、在冬至版夏曆固定在十一月、在雨水版夏曆和在顓頊曆則只可說大致在十一月。殷曆和冬至版夏曆都以閏餘無為蔀首,置閏之歲與周曆和黃帝曆一致。雨水版夏曆以雨水合朔齊同為蔀首,冬至在雨水之前(1/6)歲實=(2+7/114)朔策,由此推出蔀首冬至的月齡是107/114,其後十八歲的冬至月齡是(略去分母114):35、77、5、47、89、17、59、101、29、71、113、41、83、11、53、95、23、65,置閏之歲是第一、三、六、九、十二、十四和十七歲。顓頊曆以立春合朔齊同為蔀首,冬至在立春之前(1/8)歲實=(1+83/152)朔策,由此推出蔀首冬至的月齡是69/152,其後十八歲的冬至月齡是(略去分母152):125、29、85、141、45、101、5、61、117、21、77、133、37、93、149、53、109、13,置閏之歲是第二、五、七、十、十三、十六和十八歲。

閏餘法只規定哪一歲須要置閏,但沒有規定閏月的位置,閏月可以置於年終也可以置於年中。年終置閏很簡單,不必細說,現在談談年中置閏的法則。如上述,當冬至的月齡達到或超過12/19時須要置閏。每歲的冬至月齡增加7/19,將此數除以12得7/228,把這一歲的冬至月齡在建子月後每月加上7/228,則在十二個月內必然會達到或超過一,閏餘的年中置閏法則是以累積月齡數剛剛達到或超過一的那個月作為閏月。

魯曆、雨水版夏曆和顓頊曆相對於蔀首的置閏之歲雖然和其餘古六曆不同,但是只要改變起算之歲,就可以得到其餘六曆的相同置閏之歲次序,也符合3-3-3-2-3-3-2的規律。節氣的月齡有一章(十九年)的週期,所以用閏餘法得出的閏月也有十九年的週期。這當然是因為四分術的歲實和朔策有19歲實=235朔策的關係, 235=19×12+7,所以十九年要置七個閏月。當然,最簡單的置閏法則是把7個閏月均勻放在235個月之間。這樣,閏月應出現在第(235j/7)個月(j=1、2、3、4、5、6、7),取最接近的整數,便得出閏月應置於第34、67、101、134、168、201和235個月,而這些月份落在第三、六、九、十一、十四、十七和十九歲,正是3-3-3-2-3-3-2的規律。周曆、殷曆、黃帝曆和冬至版夏曆都是以冬至合朔齊同作曆元,用閏餘年中置閏法得出四曆的閏月出現在第34、68、101、135、168、202和235個月,和上述閏月均勻安排基本上相同,兩者的差異是由於閏餘年中置閏法要求月齡累積數達到或超出一才置閏,所以與均勻置閏取最接近(235j/7)的整數不同,如果取不小於(235j/7)的最小整數就沒有差異了。其餘曆法的年中閏月位置不同,是由於月數的起算點不同而已。


固 定 冬 至 法

這法則是以冬至固定在某個特定的月份內的原則決定要不要置閏,冬至固定的月份以曆法年首的月建決定。周曆、魯曆、黃帝曆都以建子為正月月建,所以冬至固定在正月;殷曆以建丑為正月,冬至固定在十二月;夏曆以建寅為正月,冬至固定在十一月;顓頊曆雖然以建亥為年首,但採用夏曆的月序,所以冬至也是固定在十一月。

如前述,「歲」是指從建子月初一日到下一個建子月之前一日的那段時間。一歲可以有十二個月,也可以有十三個月。這裡稱含十二個月的稱為「平歲」,含十三個月稱為「閏歲」。由於固定冬至法規定建子月必定是某個特定月份,閏歲那十三個月中必定要有閏月,閏月置於年終,而平歲則沒有閏月,這就是固定冬至法的置閏規則。潛規則是一歲必須有十二個正常月而且每個常月只能出現一次。

固定冬至法在很多情況下所得的閏月年份和閏餘法一致,其實這也不難理解。四分術的歲實=(12+7/19)朔策,如果某歲冬至的月齡是K,建子月的朔在冬至之前K個朔策,下一歲的冬至在建子月朔後(12+K+7/19)個朔策,如果K<12/19,下一歲冬至在建子月後不足十三個月,所以下一個建子月一般在該歲建子月後的第十二個月,也就是說兩建子月相差十二個月,是平歲而沒有閏月;如果K≥12/19,下一歲冬至在建子月後一般會超過十三個月,這時兩建子月相差十三個月,所以就有閏月。結果與閏餘法則一致。但是這只是一般的情況,有時會有例外。下面以顓頊曆為例說明。

根據上面計算的顓頊曆冬至月齡,在入蔀第十五歲的月齡是93/152<12/19,按閏餘法這歲沒有閏月,下一歲(即入蔀第十六歲)的冬至月齡是149/152>12/19,按閏餘法這歲須置閏。入蔀第十六歲的冬至離十一月朔有149/152朔策,也就是說在十二月朔之前3/152個朔策,即13小時59分18秒。如果十二月朔發生在13:59:18以後,則冬至與十二月朔發生在同一日。計算得出十二月朔的時刻在16:14:18,而冬至在同日2:15。也就是說根據閏餘法入蔀第十六歲的冬至在十二月初一,這是固定冬至法不允許的。中國歷來以子正(午夜零時)作為一日的起始時刻,雖然十二月朔的時刻遲於冬至時刻,但是冬至與朔仍然視為同在一日。固定冬至法規定顓頊曆冬至必須在十一月,所以那個遲冬至約14小時的朔只能是十一月朔,這樣一來入蔀第十五歲的十一月和入蔀第十六歲的十一月相差十三個月,所以按固定冬至法顓頊曆的入蔀第十五歲要置閏;入蔀第十六歲的十一月和入蔀第十七歲的十一月只差十二個月而不設閏月。這與閏餘法規定的置閏之歲不同,可見固定冬至法和閏餘法有時會有差異。

從上面例子可以看出,一般而言如果冬至月齡非常表近一的時候,有可能會出現冬至與冬至之後的合朔相差少於一日而同在一日,這時閏餘法和固定冬至法就會有差異。對於周曆、魯曆、黃帝曆、殷曆和冬至版夏曆,冬至的月齡在0和18/19之間,也就是說冬至和其後的合朔相差大於1.55日,不可能出現冬至和其後的朔同在一日的情況,用閏餘法和固定冬至法計算此五曆會得出相同的結果。


無 中 氣 法

無中氣法也是把冬至固定在某個特定的月份,如果兩個建子月相差十二個月(平歲)則不閏,相差十三個月(閏歲)則閏。無中氣法對閏月的位置有明確規定:閏月置於無中氣的月份。

節氣網頁所述,中氣是指由立春算起雙數的節氣,即雨水、春分、穀雨、小滿、夏至、大暑、處暑、秋分、霜降、小雪、冬至、大寒。根據平氣法兩中氣的時間間隔是歲實的十二分之一,用四分術的歲實得(30+7/16)日。由於時間相差大於三十日,一個月最多只能有一個中氣。一歲有十二個中氣,平歲有十二個月,由此可知每月含一個中氣。閏歲有十三個月,但只有十二個中氣,由此可知有一個月(而且只能有一個月)不含中氣,無中氣法就把這個唯一不含中氣的月份定為閏月。因為把冬至固定在某個特定的月份,而閏月不含中氣,所以非閏月的月份含的中氣也固定。以夏曆為例,冬至之月(建子)固定在十一月,從而推出十二月必含大寒、正月必含雨水、二月必含春分等。這樣月份與中氣有一一對應的關係。換言之,固定冬至法把冬至固定在指定的月份,無中氣法把十二個中氣固定在指定的十二個月份。

用無中氣法得出的閏月和用閏餘之年中置閏法的結果大致相同,這也不難理解。假設某歲冬至的月齡是K,建子朔就一般在冬至之前K個朔策。兩中氣相隔歲實/12=(1+7/228)朔策,故大寒在冬至之後(1+7/228)朔策,在建子朔後(1+K+7/228)朔策,在建子朔算起的第二個朔後(K+7/228)朔策。同理,雨水在建子朔算起的第三個朔後(K+7/228+7/228)朔策,餘類推。這規律與閏餘年中置閏的月齡累加法相同。當累加之和剛剛達到或超過一的時候就意味著會有一個中氣離開前一中氣之月之後的那一個月超過一個朔策,也就是說前一中氣之月之後的那一個月不含中氣,所以是閏月。但是當累加之和很接近一時,中氣與其後的朔可能會同在一日,這時該中氣歸其後之朔的月份,之前的月份就不含中氣而定為閏月,這閏月便會和閏餘年中置閏法有一個月之差。所以無中氣法和閏餘年中置閏法有時會有差異。

四分術的19歲實=235朔策,19歲有19×12=228個中氣,228=235-7,所以一章(十九年)一般有七個無中氣月,但有可能出現合朔遲於中氣但在同一日的情況,這可能會使閏月偏離十九年七閏的規律。一蔀(76年)後節氣與合朔的關係與曆元一致,所以無中氣法必定符合七十六年二十八閏的規律。

史書並沒有記載無中氣法在漢朝以前是否使用過,但是自漢武帝太初元年(公元前104年)開始在其後的一千七百多年中,無中氣法一直是中國曆法的置閏標準。直到清順治二年(1645年)改用定氣計算節氣後,置閏法則才須要略加修改以應付平歲可出現無中氣月、閏歲可出現兩個無中氣月這些平氣法不可能出現的現象。現在農曆的置閏法則是平歲無論有沒有無中氣月都不置閏,閏歲則把閏月置於冬至後第一個無中氣的月份。用平氣法計算二十四節氣,平歲不可能出現無中氣月,閏歲只有一個無中氣月,所以現行置閏法則用於平氣節氣得出的結果和無中氣法完全相同,可說是無中氣法的推廣法則。


六 曆 算 例

這裡以兩個例子展示用固定冬至法和無中氣法計算古六曆。為方便起見,下面用Ny表示曆年年首最表近公元y年1月1日的曆年,用Sy表示最表示歲首最接近公元y年1月1日的歲。由於六曆的年首月建和朔日都不盡相同,Ny對於各曆指不同的時段。例如周曆的N-325始於-326年12月19日、終於-325年12月7日;魯曆的N-325始於-326年12月20日、終於-325年12月8日;冬至版夏曆的N-325始於-325年2月16日、終於-324年3月5日;顓頊曆的N-325始於-326年11月20日、終於-325年11月8日。同樣道理,Sy在各曆也指不同的時段。


例一: 計算周曆在N-386(周元安王十五年)的月份編排。

根據公式(4)和表二,周曆最接近-386年1月1日的冬至儒略日數是
JD(W(-386))=1721050.5 + 3/4 - 386×(365 + 1/4) = 1580064.5 + 1/4
冬至日正午的儒略日數是1580065,用儒略日轉公曆的標準方法(例如理查斯算法)算出儒略日1580065對應的公曆日期是-387年12月25日,故周曆的冬至在12月25日子正後1/4日(即6時)。用干支網頁的公式求得冬至日的天干數是 [下面的mod(X,Y)指X除以Y後所得之餘數]
1 + mod(1580065-1, 10) = 5,日天干是戊;冬至日的地支數是
1 + mod(1580065+1, 12) = 3,日地支是寅,所以冬至日干支是戊寅。

周曆的正月是建子,也就是說正月含冬至,正月朔是冬至日之前的第一個朔日。用公 式(1)和表二,我們要求出最大的整數i使得
1683430.5 + i·PL < 1580065.5        i=floor(-103365/PL) = -3501。
這裡floor(x)表示不大於x的最大整數。注意1580065.5是冬至日下一日子正的儒略日數,這是說合朔時刻可以遲於冬至時刻,但不可以遲於冬至所在之日註四,如果-103365/PL是整數的話要減一,因為正月朔不可在冬至下一日的夜半,下一節會介紹一個方法使這特殊情況不會出現。求得i後,合朔的儒略日數是
JD1=1683430.5-3501×(29+499/940)=1580042.5 + 461/940。用上面所述的儒略日轉公曆和日干支計算算出1580043對應的公曆日期是-387年12月3日、日干支是丙辰,這就是周曆在N-386的正月初一。合朔離子正有461/940日(今天會說11時46分13秒)。古代計算不用十進制小數,日的小數部分(奇零)以分數表示稱為小餘,所以461/940是正月朔的小餘。

要知道N-386有沒有閏月,就要計算正月與下一個正月之間的月數。下一歲的冬至是
JD(W(-385)) = JD(W(-386)) + 365 + 1/4 = 1580430
W(-385)發生在正午,下一日子正的儒略日數是1580430.5。如果N-386沒有閏月,N-385正月朔在JD1以後12個朔策;如果N-386有閏月,N-385正月朔在JD1以後13個朔策。
JD1 + 13PL = 1580426.5 + 368/940 < 1580430.5
由此可知N-385的正月在N-386正月的十三個月後,因此N-386有閏月。如果用固定冬至法,閏月置於年終;用無中氣法就要找出哪一個月不含中氣。中氣的儒略日期可用公式(5)計算,即把JD(W(-386)) 累加Ps/12,周曆每月的合朔用JD1累加PL便可得,下表給出計算結果。

JD(朔日)-1580000.5JD(中氣)-1580000.5
42 (正月朔)
64 (冬至)
72
94 (大寒)
101
125 (雨水)
131
155 (春分)
160
186 (穀雨)
190
216 (小滿)
219
246 (夏至)
249
277 (大暑)
278
307 (處暑)
308
337
338 (秋分)
367
368 (霜降)
396
399 (小雪)
426 (正月朔)
429 (冬至)

JD(朔日)指合朔當日子正的儒略日數,JD(中氣)指中氣當日子正的 儒略日數,所以減去1580000.5後是整數。表中可見JD(朔日)-1580000.5=308對應的月份不含中氣,那是正月之後的第九個朔,所以是閏九月。下表把周曆N-386的月份列出。固定冬至法和無中氣法所得的朔日完全相同,只是月序不同而已。

周 曆 N-386 的 月 份 編 排: 月 序 (定 冬) 指 用 固 定 冬 至 法 所 得 的 月 序,月 序 (無 中) 指 用 無 中 氣 法 所 得 的 月 序, 合 朔 小 餘 欄 的 數 字 略 去 了 分 母 940。
月序(定冬)月序(無中)日數朔日干支(公曆日期)合朔小餘
正 月正 月30丙辰(-387年12月3日)461
二 月二 月29丙戌(-386年1月2日)20
三 月三 月30乙卯(1月31日)519
四 月四 月29乙酉(3月2日)78
五 月五 月30甲寅(3月31日)577
六 月六 月29甲申(4月30日)136
七 月七 月30癸丑(5月29日)635
八 月八 月29癸未(6月28日)194
九 月九 月30壬子(7月27日)693
十 月閏 九 月29壬午(8月26日)252
十 一 月十 月30辛亥(9月24日)751
十 二 月十 一 月29辛巳(10月24日)310
閏 月十 二 月30庚戌(11月22日)809

每月的日數由該月之朔日與下月之朔日相隔的日數而定,相隔29日是小月,相隔30日是大月。如前述,合朔小餘是合朔離子正的時間以分數日表示,分母940往往略去。由於朔策是(29+499/940)日,每月的合朔小餘是前月的小餘加上499,達到或超過940則減去940,合朔小餘如果小於441,加了499後仍小於940,則此月是小月,大於或等於441時則是大月。用現在通行的24小時制來說或會較易理解,朔策是29日12小時44分26秒,所以每月的合朔離午夜零時的時間是前月的時間加上12小時44分26秒,達到或超過24時則減去24,合朔時間如果在11:15:34前,加了12小時44分26秒後仍小於24時,則此月是小月,合朔時間如果在11:15:34或之後則是大月。


例二: 計算冬至版夏曆在N-386的月份編排。

根據公式(4)和表二,冬至版夏曆最接近-386年1月1日的冬至儒略日數是
JD(W(-386))=1721053.5 + 3/4 - 386×(365 + 1/4) = 1580067.5 + 1/4
儒略日1580068對應的公曆日期是-387年12月28日,日干支是辛巳。固定冬至法和無中氣法都把冬至固定在夏曆的十一月,所以十一月朔發生在冬至的下一日子正之前。用公式(1)和表二,我們要要求出最大的整數i使得
1883590.5 + i·PL < 1580068.5        i=floor(-303522/PL) = -10279。
由此可算出十一月朔的儒略日數是
JD1 = 1883590.5 - 10279PL = 1580042.5 + 359/940
合朔小餘是359/940。儒略日數1580043對應得公曆日期是-387年12月3日,日干支是丙辰。要知道S-386有沒有閏月,可以比較儒略日數floor(JD(W(-385))+1.5)和floor(JD1+13PL+0.5)哪個較大。加上0.5是為了使子正的數字由0.5結尾化為整數。
floor(JD(W(-385))+1.5) = floor(1580067.75+365.25+1.5)=1580434,
floor(JD1+13PL+0.5)=floor(1580042.5 + 359/940 + 13×(29 + 499/940) + 0.5) = 1580427 < 1580434
所以S-386是閏歲。固定冬至法規定閏月置於年終,即十二月後,所以正月朔是十一月朔後的第三個合朔,由於這個朔日最接近公曆-386年1月1日,根據定義此朔日是夏曆N-386的正月朔,前月的閏月屬於N-387,因此N-386沒有閏月。這是固定冬至法的結果,無中氣法則不同,我們要找出此閏歲的無中氣月,這可用例一的方法計算,結果是無中氣之月在N-387十一月之後的第五個月,屬於N-386,因此N-387沒有閏月,N-386的正月朔是N-387十一月朔之後的第二個朔,而閏月是N-386的閏三月。下表總結計算結果。

夏 曆 (冬 至 版) N-386 的 月 份 編 排: 月 序 (定 冬) 指 用 固 定 冬 至 法 所 得 的 月 序,月 序 (無 中) 指 用 無 中 氣 法 所 得 的 月 序, 合 朔 小 餘 欄 的 數 字 略 去 了 分 母 940。
月序(定冬)月序(無中)日數朔日干支(公曆日期)合朔小餘
閏 月*正 月29乙卯(-386年1月31日)417
正 月二 月30甲申(3月1日)916
二 月三 月30甲寅(3月31日)475
三 月閏 三 月29甲申(4月30日)34
四 月四 月30癸丑(5月29日)533
五 月五 月29癸未(6月28日)92
六 月六 月30壬子(7月27日)591
七 月七 月29壬午(8月26日)150
八 月八 月30辛亥(9月24日)649
九 月九 月29辛巳(10月24日)208
十 月十 月30庚戌(11月22日)707
十 一 月十 一 月29庚辰(12月22日)266
十 二 月十 二 月30己酉(-385年1月20日)765

* 這是N-387的閏月


用 十 進 制 小 數 計 算 古 六 曆

上節展示的古六曆算例用分數處理日的小數部分,主要是為了方便介紹小餘這個在書籍和文獻常會提及的術語。現代的曆法計算多用電子計算機,在計算上分數其實是較為快捷的,在編寫計算機程式上處理分數運算卻較為費時,所以本網站的曆法計算全部不用分數,而是用計算機的浮點運算處理十進位小數。四分術的歲實日數用365.25表示、朔策日數用29.53085106382979表示。但是有一點要注意:當合朔或節氣小餘是0時,合朔或節氣發生在夜半,儒略日數的小數部分是0.5,但是計算機的浮點舍入誤差或會使儒略日數的小數部分變成0.49999999999,這會使日期計算有一日之差。為了避免這誤差,我把表二的儒略日數加上0.0001。合朔小餘總是1/940的整數倍,加了0.0001後,小餘的數值變成在0.094/940939.094/940之間;節氣小餘總是1/96的整數倍,加了0.0001後,小餘的數值變成在0.0096/96 和95.0096/96之間。由於小餘不可能是0,浮點舍入誤差便不會使日期有偏差了。這方法也使上一節所說的合朔可能出現在子正的特殊情況不會出現,簡化計算機程式。

用十進制小數計算時刻,不再須要理會小餘,但是如果要計算也可以:
小餘 = JD + 0.5 - floor(JD + 0.5) - 0.0001,最後的0.0001是把加上JD的0.0001減去。這小餘以十進制小數表示,如果知道小餘是1/940的整數倍,要化成以分母為940的分數也可以:
小餘 × 940 = floor(940 ( JD + 0.5 - floor(JD + 0.5) )
由於JD加上了0.0001,940 ( JD + 0.5 - floor(JD + 0.5)是某整數加上0.094,floor()則把小數部份刪除。

要計算某二十四節氣的月齡也很容易,假設JD是某節氣的儒略日數,
L = (JD - JD(M0))/29.53085106382979
節氣月齡 = L - floor(L)
式中JD(M0)可從表二查得,由於JD和JD(M0)都加了0.0001,相減後不用修正。L是從曆元合朔M0起算到該節氣的時間間隔以朔策為單位,月齡是節氣與上一個合朔的時間間隔,如果以朔策為單位,就是L的小數部分,如果L是負數則須用一減去小數部分。由於floor(L)是不小於L的最大整數,所以上面公式也適用於負數的L,編寫程式時無須特別處理。



備 註 和 參 考 文 獻