春 秋 魯 國 曆 法 的 復 原 方 法

初稿: 2019年3月


遠古時期,中國的曆法根據觀測天象而制定,到了春秋時期(公元前722年–前481年),人們初步掌握了計算月相的方法,開始推步曆法。春秋時期各國施行不同曆法,可惜這些曆法全部散失,現在我們只能從《春秋》這部由孔子修訂的魯國編年史書中獲得當時魯國施行曆法的不完整資料,這裡稱當時魯國的曆法為春秋曆。

本網頁介紹春秋曆的一個復原方法,這方法是根據張培瑜、陳美東、薄樹人和胡鐵珠著的《中国古代历法》(中国科学出版社‧北京‧2008年3月)書中第三章第五節的資料。該書的前言說書中各章節由四人分別執筆,第三章由張培瑜撰寫。張培瑜是中國科學院紫金山天文臺的研究員。


內容

  1. 合 朔 計 算
  2. 閏 月 和 積 月
  3. 《中 国 古 代 历 法》表 3-7 勘 誤
  4. 春 秋 曆 的 閏 月 和 正 月 月 建
  5. 復 原 的 春 秋 曆 法 是 否 可 信 ?
  6. 儒 略 日 數
   備 註

合 朔 計 算

根據張培瑜的考證,春秋曆的朔策(即朔望月)在29.5306703日和29.5306755日之間,計算時可用30328/1027日 = (29 + 545/1027)日 = 29.53067186日。此朔策與當時的朔望月平均值(29.530583日)頗為接近,比戰國時代古六曆的朔策(29+499/940)更準,累積九百年才會有一日之差。唐朝以前的曆法都以平朔法計算合朔時刻,即假設太陽和月球以均勻的速度在天空運行。所以只要知道了其中一個合朔時刻,其他合朔時刻只須加上朔策的整數倍即可求得。

根據張培瑜的春秋曆還原法,春秋曆推算魯隱公元年(公元前722年)正月初一的朔日在冬至之後的第一個辛巳日,合朔時刻離辛巳日子正(即午夜零時)有268/1027日。用公曆和現在的時間系統表示,這個推算時刻是公元前722年1月16日06:16。當時不知道各地有各自地方時,所以這時刻可視為魯國當地(山東曲阜)的地方時。古代計算不用十進制小數,日的小數部分(奇零)以分數表示稱為小餘。因此268/1027就是這個朔的小餘,由於此朔對應正月初一,可稱為正朔小餘。小餘也可視為合朔在當日的時間以日的分數表示,用現行的24小時制,小餘268/1027就是6:15:46(6時15分46秒)。根據平朔法,下一個合朔時刻離辛巳日子正有(268/1027 + 29 + 545/1027)日=(29 + 813/1027)日,所以二月朔離辛巳日子正的日數是29、小餘813,此後提及小餘時略去分母1027。用同餘算術很容易求得二月初一的日干支:天干十日一週期,29 = 30 - 1,所以辛巳日29日後的日干是辛之前的天干,即庚;地支十二日一週期,29除以12餘5,巳之後的第五個地支是戌;所以二月初一的日干支是庚戌。公曆日期也容易計算:1月(16+29)日 = 2月(16+29-31)日 = 2月14日。

春秋曆的合朔時刻可用以下公式表示:

Mi = M0 + i (29 + 545/1027)日     (1)

此處M0是某一合朔時刻,可以定為魯隱公元年的正月朔時刻,i是從M0算起的朔望月數。

為方便成見,此處用NY表示正月初一最接近公曆Y年1月1日的春秋曆年份。例如N-721指魯隱公元年,始於公元-721年(即前722年)1月16日、終於-720年1月4日。如果知道了從魯隱公元年的正月到某春秋曆年Ny正月的累積月數A(y),則Ny正月合朔時刻Z(y)是

Z(y) = M0 + A(y) (29 + 545/1027)日    (2)

只要知道積月A(y),春秋曆年Ny的正月初一便求得,Ny的其他月份也可輕易計算。積月A(y)可用遞歸公式計算:如果Ny沒有閏月,則Ny+1正月的積月是A(y+1)=A(y)+12;如果Ny有閏月,則Ny+1正月的積月是A(y+1)=A(y)+13。按定義A(-721)=0,所以如果知道春秋曆所有的閏月資料就可以計算各年的日曆。


閏 月 和 積 月

春秋曆並沒有固定的置閏法則,當時是靠觀測天象與日曆的差異來決定該年是否要設閏月,春秋曆的閏月情況現在只能從《春秋》書中的日期記載推斷。張培瑜根據前人和自己的研究製定了春秋曆各年的正朔表,載於《中国古代历法》表3-7。表中載有作者還原春秋曆的正月月建、正朔日干支、正朔小餘和冬至日期,此外還列出清末曆算家王韜《朔閏日至考》的春秋曆正朔以資比較。比較表中的正朔日干支可推出該年是否有閏月,但這樣做比較費時,較簡單的方法是比較表中列出的正朔小餘。

如前述,正朔小餘是正月合朔離朔日子正的時間用分數日來表示,其中基數(即分母)1027往往略去。如果Ny沒有閏月,Ny的正朔小餘K(y)與下一年Ny+1的正朔小餘K(y+1)有以下關係:
K(y+1) = mod(K(y) + 12×545, 1027) = mod(K(y) + 378, 1027)    (3)
如果Ny有閏月,則
K(y+1) = mod(K(y) + 13×545, 1027) = mod(K(y) - 104, 1027)    (4)

這裡mod(X, Y)指X除以Y後所得之餘數。利用這兩條公式來比較表中的正朔小餘,便可輕易推出該年是否有閏月,然後用A(y)的遞歸公式算出春秋曆各年的積月。下表給出計算結果,帶有星號的春秋曆年表示該年有閏月,表中還列出正月月建、正朔日干支、正朔公曆日期和正朔小餘。


春秋曆年積月正月月建正朔日干支正朔公曆日期正朔小餘
N-7210辛巳公元前722年1月16日268
*N-72012乙亥公元前721年1月5日646
N-71925己亥公元前720年1月23日542
N-71837癸巳公元前719年1月12日920
*N-71749戊子公元前718年1月2日271
N-71662壬子公元前717年1月21日167
*N-71574丙午公元前716年1月9日545
N-71487庚午公元前715年1月28日441
*N-71399甲子公元前714年1月17日819
N-712112戊子公元前713年2月5日715
N-711124癸未公元前712年1月25日66
*N-710136丁丑公元前711年1月14日444
N-709149辛丑公元前710年2月2日340
N-708161乙未公元前709年1月22日718
*N-707173庚寅公元前708年1月11日69

* 此農曆年有閏月

春秋曆年積月正月月建正朔日干支正朔公曆日期正朔小餘
N-706186癸丑公元前707年1月29日992
N-705198戊申公元前706年1月19日343
*N-704210壬寅公元前705年1月8日721
N-703223丙寅公元前704年1月26日617
N-702235庚申公元前703年1月15日995
*N-701247乙卯公元前702年1月5日346
N-700260己卯公元前701年1月24日242
*N-699272癸酉公元前700年1月12日620
N-698285丁酉公元前699年1月31日516
N-697297辛卯公元前698年1月20日894
N-696309丙戌公元前697年1月10日245
*N-695321庚辰公元前697年12月29日623
N-694334甲辰公元前695年1月17日519
N-693346戊戌公元前694年1月6日897
*N-692358癸巳公元前694年12月27日248

* 此農曆年有閏月

春秋曆年積月正月月建正朔日干支正朔公曆日期正朔小餘
N-691371丁巳公元前692年1月14日144
*N-690383辛亥公元前691年1月3日522
N-689396乙亥公元前690年1月22日418
N-688408己巳公元前689年1月11日796
N-687420甲子公元前689年12月31日147
*N-686432戊午公元前688年12月20日525
N-685445壬午公元前686年1月8日421
N-684457丙子公元前686年12月28日799
N-683469辛未公元前685年12月17日150
N-682481乙丑公元前684年12月6日528
*N-681493己未公元前683年11月25日906
*N-680506癸未公元前682年12月14日802
N-679519丁未公元前680年1月1日698
*N-678531壬寅公元前680年12月22日49
*N-677544乙丑公元前678年1月9日972

* 此農曆年有閏月

春秋曆年積月正月月建正朔日干支正朔公曆日期正朔小餘
N-676557己丑公元前677年1月28日868
N-675569甲申公元前676年1月17日219
*N-674581戊寅公元前675年1月6日597
N-673594壬寅公元前674年1月25日493
N-672606丙申公元前673年1月14日871
N-671618辛卯公元前672年1月3日222
*N-670630乙酉公元前672年12月23日600
N-669643己酉公元前670年1月11日496
N-668655癸卯公元前670年12月31日874
*N-667667戊戌公元前669年12月20日225
N-666680壬戌公元前667年1月8日121
*N-665692丙辰公元前667年12月28日499
N-664705庚辰公元前665年1月16日395
N-663717甲戌公元前664年1月4日773
*N-662729己巳公元前664年12月25日124

* 此農曆年有閏月

春秋曆年積月正月月建正朔日干支正朔公曆日期正朔小餘
N-661742癸巳公元前662年1月13日20
N-660754丁亥公元前661年1月2日398
*N-659766辛巳公元前661年12月21日776
*N-658779乙巳公元前659年1月9日672
N-657792己巳公元前658年1月28日568
N-656804癸亥公元前657年1月17日946
N-655816戊午公元前656年1月6日297
N-654828壬子公元前656年12月26日675
N-653840丁未公元前655年12月16日26
*N-652852辛丑公元前654年12月5日404
N-651865乙丑公元前653年12月23日300
*N-650877己未公元前652年12月12日678
N-649890癸未公元前651年12月31日574
*N-648902丁丑公元前650年12月20日952
N-647915辛丑公元前648年1月7日848

* 此農曆年有閏月

春秋曆年積月正月月建正朔日干支正朔公曆日期正朔小餘
*N-646927丙申公元前648年12月28日199
N-645940庚申公元前646年1月16日95
N-644952甲寅公元前645年1月5日473
N-643964戊申公元前645年12月24日851
*N-642976癸卯公元前644年12月14日202
N-641989丁卯公元前642年1月2日98
*N-6401001辛酉公元前642年12月22日476
N-6391014乙酉公元前640年1月9日372
N-6381026己卯公元前640年12月29日750
N-6371038甲戌公元前639年12月19日101
*N-6361050戊辰公元前638年12月8日479
N-6351063壬辰公元前637年12月26日375
*N-6341075丙戌公元前636年12月15日753
N-6331088庚戌公元前634年1月3日649
N-6321100乙巳公元前634年12月24日0

* 此農曆年有閏月

春秋曆年積月正月月建正朔日干支正朔公曆日期正朔小餘
N-6311112己亥公元前633年12月12日378
N-6301124癸巳公元前632年12月1日756
*N-6291136戊子公元前631年11月21日107
N-6281149壬子公元前630年12月10日3
N-6271161丙午公元前629年11月28日381
*N-6261173庚子公元前628年11月17日759
*N-6251186甲子公元前627年12月6日655
N-6241199戊子公元前626年12月25日551
*N-6231211壬午公元前625年12月13日929
N-6221224丙午公元前623年1月1日825
N-6211236辛丑公元前623年12月22日176
*N-6201248乙未公元前622年12月11日554
N-6191261己未公元前621年12月29日450
N-6181273癸丑公元前620年12月18日828
*N-6171285戊申公元前619年12月8日179

* 此農曆年有閏月

春秋曆年積月正月月建正朔日干支正朔公曆日期正朔小餘
N-6161298壬申公元前618年12月27日75
N-6151310丙寅公元前617年12月15日453
*N-6141322庚申公元前616年12月4日831
N-6131335甲申公元前615年12月23日727
N-6121347己卯公元前614年12月13日78
*N-6111359癸酉公元前613年12月1日456
N-6101372丁酉公元前612年12月20日352
N-6091384辛卯公元前611年12月9日730
*N-6081396丙戌公元前610年11月29日81
N-6071409己酉公元前609年12月16日1004
N-6061421甲辰公元前608年12月6日355
N-6051433戊戌公元前607年11月25日733
*N-6041445癸巳公元前606年11月15日84
N-6031458丙辰公元前605年12月2日1007
*N-6021470辛亥公元前604年11月22日358

* 此農曆年有閏月

春秋曆年積月正月月建正朔日干支正朔公曆日期正朔小餘
*N-6011483乙亥公元前603年12月11日254
N-6001496己亥公元前602年12月30日150
N-5991508癸巳公元前601年12月18日528
*N-5981520丁亥公元前600年12月7日906
N-5971533辛亥公元前599年12月26日802
N-5961545丙午公元前598年12月16日153
*N-5951557庚子公元前597年12月4日531
N-5941570甲子公元前596年12月23日427
*N-5931582戊午公元前595年12月12日805
N-5921595壬午公元前594年12月31日701
N-5911607丁丑公元前593年12月20日52
N-5901619辛未公元前592年12月9日430
*N-5891631乙丑公元前591年11月28日808
N-5881644己丑公元前590年12月17日704
N-5871656甲申公元前589年12月6日55

* 此農曆年有閏月

春秋曆年積月正月月建正朔日干支正朔公曆日期正朔小餘
*N-5861668戊寅公元前588年11月25日433
N-5851681壬寅公元前587年12月14日329
N-5841693丙申公元前586年12月3日707
*N-5831705辛卯公元前585年11月22日58
N-5821718甲寅公元前584年12月10日981
N-5811730己酉公元前583年11月30日332
*N-5801742癸卯公元前582年11月19日710
N-5791755丁卯公元前581年12月7日606
*N-5781767辛酉公元前580年11月26日984
*N-5771780乙酉公元前579年12月15日880
N-5761793己酉公元前577年1月3日776
N-5751805甲辰公元前577年12月23日127
N-5741817戊戌公元前576年12月12日505
*N-5731829壬辰公元前575年12月1日883
N-5721842丙辰公元前574年12月20日779

* 此農曆年有閏月

春秋曆年積月正月月建正朔日干支正朔公曆日期正朔小餘
*N-5711854辛亥公元前573年12月9日130
N-5701867乙亥公元前572年12月28日26
N-5691879己巳公元前571年12月17日404
*N-5681891癸亥公元前570年12月6日782
N-5671904丁亥公元前569年12月24日678
N-5661916壬午公元前568年12月14日29
*N-5651928丙子公元前567年12月3日407
N-5641941庚子公元前566年12月22日303
N-5631953甲午公元前565年12月10日681
*N-5621965己丑公元前564年11月30日32
N-5611978壬子公元前563年12月18日955
*N-5601990丁未公元前562年12月8日306
N-5592003辛未公元前561年12月26日202
N-5582015乙丑公元前560年12月15日580
N-5572027己未公元前559年12月4日958

* 此農曆年有閏月

春秋曆年積月正月月建正朔日干支正朔公曆日期正朔小餘
*N-5562039甲寅公元前558年11月24日309
N-5552052戊寅公元前557年12月12日205
N-5542064壬申公元前556年12月1日583
*N-5532076丙寅公元前555年11月20日961
*N-5522089庚寅公元前554年12月9日857
N-5512102甲寅公元前553年12月27日753
N-5502114己酉公元前552年12月17日104
*N-5492126癸卯公元前551年12月6日482
N-5482139丁卯公元前550年12月25日378
N-5472151辛酉公元前549年12月13日756
N-5462163丙辰公元前548年12月3日107
*N-5452175庚戌公元前547年11月22日485
*N-5442188甲戌公元前546年12月11日381
N-5432201戊戌公元前545年12月29日277
N-5422213壬辰公元前544年12月18日655

* 此農曆年有閏月

春秋曆年積月正月月建正朔日干支正朔公曆日期正朔小餘
N-5412225丁亥公元前543年12月8日6
*N-5402237辛巳公元前542年11月27日384
N-5392250乙巳公元前541年12月15日280
*N-5382262己亥公元前540年12月4日658
N-5372275癸亥公元前539年12月23日554
N-5362287丁巳公元前538年12月12日932
*N-5352299壬子公元前537年12月1日283
N-5342312丙子公元前536年12月20日179
*N-5332324庚午公元前535年12月9日557
N-5322337甲午公元前534年12月28日453
N-5312349戊子公元前533年12月16日831
*N-5302361癸未公元前532年12月6日182
N-5292374丁未公元前531年12月25日78
N-5282386辛丑公元前530年12月14日456
N-5272398乙未公元前529年12月2日834

* 此農曆年有閏月

春秋曆年積月正月月建正朔日干支正朔公曆日期正朔小餘
*N-5262410庚寅公元前528年11月22日185
N-5252423甲寅公元前527年12月11日81
*N-5242435戊申公元前526年11月30日459
N-5232448壬申公元前525年12月18日355
*N-5222460丙寅公元前524年12月7日733
N-5212473庚寅公元前523年12月26日629
*N-5202485甲申公元前522年12月15日1007
N-5192498戊申公元前520年1月2日903
N-5182510癸卯公元前520年12月23日254
N-5172522丁酉公元前519年12月12日632
*N-5162534辛卯公元前518年12月1日1010
N-5152547乙卯公元前517年12月19日906
N-5142559庚戌公元前516年12月9日257
*N-5132571甲辰公元前515年11月28日635
*N-5122584戊辰公元前514年12月17日531

* 此農曆年有閏月

春秋曆年積月正月月建正朔日干支正朔公曆日期正朔小餘
N-5112597壬辰公元前512年1月4日427
N-5102609丙戌公元前512年12月24日805
N-5092621辛巳公元前511年12月14日156
N-5082633乙亥公元前510年12月3日534
*N-5072645己巳公元前509年11月21日912
N-5062658癸巳公元前508年12月10日808
*N-5052670戊子公元前507年11月30日159
N-5042683壬子公元前506年12月19日55
*N-5032695丙午公元前505年12月7日433
N-5022708庚午公元前504年12月26日329
N-5012720甲子公元前503年12月15日707
N-5002732己未公元前502年12月5日58
*N-4992744癸丑公元前501年11月23日436
N-4982757丁丑公元前500年12月12日332
*N-4972769辛未公元前499年12月1日710

* 此農曆年有閏月

春秋曆年積月正月月建正朔日干支正朔公曆日期正朔小餘
N-4962782乙未公元前498年12月20日606
*N-4952794己丑公元前497年12月8日984
N-4942807癸丑公元前496年12月27日880
N-4932819戊申公元前495年12月17日231
*N-4922831壬寅公元前494年12月6日609
N-4912844丙寅公元前493年12月24日505
N-4902856庚申公元前492年12月13日883
*N-4892868乙卯公元前491年12月3日234
N-4882881己卯公元前490年12月22日130
*N-4872893癸酉公元前489年12月10日508
N-4862906丁酉公元前488年12月29日404
N-4852918辛卯公元前487年12月18日782
*N-4842930丙戌公元前486年12月8日133
N-4832943庚戌公元前485年12月26日29
N-4822955甲辰公元前484年12月15日407

* 此農曆年有閏月

春秋曆年積月正月月建正朔日干支正朔公曆日期正朔小餘
*N-4812967戊戌公元前483年12月4日785
N-4802980壬戌公元前482年12月23日681
N-4792992丁巳公元前481年12月12日32

* 此農曆年有閏月


有了積月後,春秋曆的計算便十分簡單,而表中除了正月月建有時要比較難決定外,其他各欄的數據也可用積月輕易計算,這裡以N-649(魯僖公十年)作為例子說明。從表中得知N-649的正月積月是890,所以合朔時刻離N-721正朔辛巳日子正的時間是
[268/1027 + 890×(29 + 545/1027) ]日= (26282 + 574/1027)日
日數是26282、小餘574,小餘與表中數據吻合。日天干十日一週、日地支十二日一週,據此用同餘算術算得辛巳日後26282日的日干支是癸未,也與表中相符。公曆日期的計算可先由-721年至-649年的積日著手。公曆在1582年10月15日前用儒略曆,能被四整除的年份是閏年,有366日,其餘是平年,有365日。公元-721年至-649年有72年,其中有閏年的年份是-720年、-716年……-652年共18年,所以從-721年1月16日到-649年1月16日有(365×72 + 18)日=26298日=(26282+16)日,所以N-649的正月初一在-649年1月16日之前16日,即-650年12月31日,亦與表中的數據一致。至於正月月建,按定義含冬至的月份為建子(參看干支網頁),但是春秋曆沒有計算冬至的方法,當時是靠觀象測定,所以應接近當時實際的定氣冬至,根據氣朔時刻網頁,公元-650的冬至在12月28日註一。正月初一在12月31日,在冬至後三日,顯然上一個月含冬至,是建子,所以正月的月建是建丑。

知道了N-649的正月朔日日期和合朔小餘後,N-649的其他月份的初一日期和合朔小餘只須把正月朔的時刻加上朔策的整數倍便可求得。N-649沒有閏月,下表把正月至十二月的初一日期﹑干支和合朔小餘列出。

N-649(魯僖公十年)的月份編排

月份朔日公曆日期朔日干支合朔小餘
正(大)前651年12月31日癸未574
二(小)前650年1月30日癸丑92
三(大)2月28日壬午637
四(小)3月30日壬子155
五(大)4月28日辛巳700
六(小)5月28日辛亥218
七(大)6月26日庚辰763
八(小)7月26日庚戌281
九(大)8月24日己卯826
十(小)9月23日己酉344
十一(大)10月22日戊寅889
十二(小)11月21日戊申407

月大月小由兩朔日之間的日期間隔決定,兩朔日相差二十九日為小月﹑三十日為大月。有了合朔小餘後,計算大小月便十分簡單。把合朔小餘加上545,然後視乎需要減去1027便得到下一個月的合朔小餘。如果某月的合朔小餘小於482,加上545後的數值不超過1027,就是說下一個朔日在二十九日後,所以該月是小月;如果某月的合朔小餘大於或等於482,加上545後便達到或起過1027,小餘要減去1027、日數要進一,就是說下一個朔日在三十日後,所以該月是大月。結論是合朔小餘小於482的月份是小月、否則是大月。用現在通行的24小時制來說或會較易理解,朔策是29日12小時44分10秒,所以每月的合朔離午夜零時的時間是前月的時間加上12小時44分10秒,達到或超過24時則減去24,合朔時間如果在11:15:50前,加了12小時44分10秒後仍小於24時,則此月是小月,合朔時間如果在11:15:50或之後則是大月。不難推出如果合朔小餘大於963就會出現連續兩個大月,但是按復原春秋曆的計算法不可能出現連續兩個小月。由於朔望月的日數稍大於29.5日,用平朔法制定的曆法不可能連續出現兩個小月。


《中 国 古 代 历 法》表 3-7 勘 誤

我用推出的積月來反推正朔日干支和正月月建以核對《中国古代历法》表3-7的數據,結果大部份與表3-7所載的資料相符,但有五項數據與表列的不合,仔細分析後發現表3-7的那五項數據與表中正朔小餘的數字有矛盾,其中之一必定有錯,我認為表3-7的那五項數據應修改如下:

春秋曆年《中国古代历法》表3-7錯誤訂正
N-720(魯隱公二年)正朔日干支: 己亥 乙亥
N-681(魯莊公十二年)正月月建: 丑
N-680(魯莊公十三年)正月月建: 寅
N-653(魯僖公六年)正朔日干支: 丙午 丁未
N-623(魯文公三年)正朔小餘: 614 929

N-720的錯誤較易處理。假如N-721沒有閏月,N-720的正朔小餘是646,與表3-7所列的一致,但日干支卻是乙亥;假如N-721有閏月,N-720的正朔小餘是164,與表列不符,而日干支是乙巳。所以無論N-721有沒有閏月,N-720的正朔日干支都不可能是己亥,己亥無疑是乙亥之誤。

比較N-682和N-681的正朔小餘,可知N-682沒有閏月,N-681的正月朔日是-682年11月25日,顯然在冬至之前,所以絕不可能是建丑。-682年的冬至在12月28日,離正月初一有33日,由此可知正月不可能含冬至,只能是建亥。-682年11月25日的日干支是己未,與表3-7所列的一致,但是建丑月朔的日干支也是己未,因此日干支與表3-7列出的月建沒有矛盾。可是假如正月的月建真是建丑,除了正朔小餘的數字不一致外,也意味著N-682有十四個月,這就應該不可能了。所以把建丑改為建亥是合理的。

解決了N-681的月建錯誤後,不難斷定N-680的建寅月建也不正確。比較N-681和N-680的正月小餘推出N-681有閏月,N-680的正朔日在-681年12月14日,正月含冬至,是建子。正朔日干支是癸未,與表3-7的數據一致,而建寅月朔日干支是壬午,不合,正朔小餘的數值也不合。改建寅為建子後就沒有問題了。

表3-7列出N-654的日干支是壬子,正朔小餘是675,N-653的正朔小餘是26=mod(675+378, 1027),由此推出N-654沒有閏月。因此從N-654正朔壬子日子正到N-653正月朔的日數是
[675/1027 + 12×(29+545/1027)]日 = (355 + 26/1027)日
日數355﹑小餘26。壬子日355天後是丁未日,是丙午日之後一天。表列的丙午應是計算錯誤。

表3-7列出N-624(魯文公二年)的正月月建是子,朔日是戊子(前626年12月25日),小餘是551。如果N-624沒有閏月,N-623的正月朔是建子月壬午日(前625年12月13日),小餘是929。如果N-624有閏月,N-623的正月朔是建丑月壬子日(前624年1月12日),小餘是447。因此無論N-624有沒有閏月,N-623的正朔小餘都不是614,表3-7列出N-623的正朔是建子月壬午日,所以小餘是929。

張培瑜著的《三千五百年历日天象》(大象出版社‧1997年7月)也有春秋曆表,其中N-721﹑N-681和N-680的正月朔日與修改表3-7後的日期一致,但是該書列出的N-675﹑N-674﹑N-600﹑N-519和N-502正月朔日與《中国古代历法》表3-7的數據相差一個月。這裡沒有採用《三千五百年历日天象》的數據,因為書中沒有說明計算方法,難以斷定是否有誤註二


春 秋 曆 的 閏 月 和 正 月 月 建

目前學界對於春秋曆閏月的位置沒有一致意見,清末的王韜為了化解《春秋》記載的某些曆日干支與推算不符,在年中加插閏月解決分歧。張培瑜指出《春秋》僅有兩次閏月的記載皆書於年終,而且春秋曆沒有年中置閏的科學依據,主張閏月應是置於年終。本網站採用張培瑜的說法把閏月置於年終。

由於春秋曆沒有固定的置閏法則,其正月月建也不固定,而是在建亥與建寅之間罷動。從復原的春秋曆可看出早期的正月月建多在建丑、後期則多在建子。張培瑜推測魯國曆法家在後期漸漸掌握了十九年七閏和回歸年的規律,可能有意把年首從建丑調整到建子。到了戰國時代,魯國使用古六曆之一的魯曆,置閏有了固定法則,把年首固定在建子。


復 原 的 春 秋 曆 法 是 否 可 信 ?

張培瑜復原的春秋曆法是根據《春秋》書中記載的曆日來推算朔策和閏月,其計算方法只能說是數據擬合的模型。合朔時刻用朔策的整數倍加曆元合朔時刻計算,符合平朔法則,但是用一個朔策來推算整個春秋242年的曆日,是假設曆法在這二百多年沒有更改過,似乎不大可能,但在缺乏資料的情況下,這做法也無可厚非。檢驗復原的春秋曆法可信程度可以從復原曆法與《春秋》記載的曆日差異來衡量。

據張培瑜在《中国古代历法》第三章第五節所述,《春秋》載有393個曆日干支,絕大多數都符合復原的春秋曆法,不符者有45條,其中有11條可用年中置閏的方法解決。《春秋》一書年代久遠,經過歷代多次傳抄後出現錯誤在所難免,而且現存《春秋》有些記錄據說確有不相容之處。有些差異當然可用「誤記」解決,但是難以判斷哪些資料屬誤記,哪些確是與復原曆法相悖。如果假設那45條確是復原曆法的不足,則復原曆法與春秋魯國的真實曆日可能有大約89%相符。再比較《中国古代历法》表3-7中復原曆法與王韜的《朔閏日至考》,得知兩者有時會有一個月的差別,這是兩人對於是否有年中閏月的觀點不同產生的。從這些資料我推測復原曆法雖然極可能與相時在魯國使用的實際曆法有差異,但差異可能不大,復原曆法對歷史學家極具參考價值。


儒 略 日 數

上面展示的計算N-649正月朔方法以N-721正月朔辛巳日子正作為計算時間的起點,現代的曆日計算大多用儒略日數,其時間起點是-4712年1月1日正午。為方便起見,這裡把這時間起點當作魯國的地方時。N-721正月朔辛巳日子正的儒略日數是1457727.5,所以把上面例子N-649正月朔的積日加上1457727.5便是儒略日數。

儒略日數的好處是已有標準方法把儒略日數轉換成公曆日期,本網站的干支網頁也有用儒略日數計算日干支的公式。其實如果只是計算春秋曆,用儒略日數並不比上面展示的方法簡單。公曆的日期編排規整,即使不用標準的儒略日數轉公曆日期的方法也不難自創方法計算。但是如果要編程序計算春秋曆、古六曆秦漢曆法時,用儒略日數就較為方便,因為各種曆法有各自的時間起算點,轉換成儒略日數就是把時間起算點統一在-4712年1月1日正午,就可以用統一的方法計算公曆日期和日干支等,這在編寫程序上很有用。

這裡介紹用儒略日數計算春秋曆的方法。上面公式(1)的合朔時刻可用以下儒略日數 表示。
JD(Mi) = 1457727.5 + 268/1027 + i(29 + 545/1027)     (5)
這裡又以N-649的正月朔為例,從上表得知該年正月朔的積月是890,代入公式(5)求得儒略日數是
JD = 1457727.5 + 268/1027 + 890× (29 + 545/1027) = 1484009.5 + 574/1027
正朔日子正的儒略日數是1484009.5,正朔小餘是574。朔日正午的儒略日數是1484010,用儒略日轉公曆的標準方法(例如理查斯算法)算出儒略日1484010對應的公曆日期是-650年12月31日。用干支網頁的公式求得朔日的天干數是
1 + mod(1484010-1, 10) = 10,日天干是癸;朔日的地支數是
1 + mod(1484010+1, 12) = 8,日地支是末,所以朔日干支是癸末。所有結果都與上面的計算吻合。

以上的計算保留以1027為分母的分數。現代的計算多用電子計算機,在計算上分數其實是較為快捷的,在編寫計算機程式上處理分數運算卻較為費時,所以用浮點計算雖然稍為降低了計算效率,但在編程式上比較簡單,而且現代的電子計算機計算速度相當快,根本不會察覺微小的效率降低。但是有一點要注意:當合朔小餘是0時,合朔發生在子正,儒略日數的小數部分是0.5,但是計算機的浮點舍入誤差或會使儒略日數的小數部分變成0.49999999999,這會使日期計算有一日之差。為了避免這誤差,可把公式(5)的儒略日數加上0.0001,即用以下公式計算合朔時刻:
JD(Mi) = 1457727.761054236 + i · 29.53067185978578      (6)
由於0.0001 = 0.1027/1027,加了0.0001後使合朔小餘從本來的0和1026之間變成0.1027到1026.1027。因為小餘的最小值不會是0,浮點舍入誤差便不會使日期有偏差了。用十進制小數計算時刻,不再須要理會小餘,但是如果要計算也可以:
小餘(略去分母1027) = floor(1027(JD + 0.5 - floor(JD + 0.5))     (7)
這裡floor(x)表示不大於x的最大整數。JD + 0.5 - floor(JD + 0.5)是小餘以十進制小數表示,乘1027後便是小餘的分子,由於加了0.0001,乘後所得的數是某整數加上0.1027,最後floor()把小數部份刪除,便得到略去分母1027的小餘。如前述,用浮點計算就不必理會小餘,計算小餘的唯一價值是用來比較《中国古代历法》表3-7的數據,從而檢驗計算程序是否正確。



備 註