久久精品成人_污污的动态图_男女无遮挡毛片视频播放_拼多多免拼单怎么操作

古 六 歷 的 計 算 方 法

初稿: 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,所以一章(十九年)有七個無中氣月。無中氣法因此符合十九年七閏法的規律。

史書并沒有記載無中氣法在漢朝以前是否使用過,但是自漢武帝太初元年(公元前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,編寫程式時無須特別處理。



備 注 和 參 考 文 獻