春 秋 鲁 国 历 法 的 复 原 方 法

初稿: 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的数据,从而检验计算程序是否正确。



备 注