返回农历编算法则


农 历 编 算 例 子

初稿: 2018年10月


这里用两个例子展示农历编算方法,最后会探讨农历年N2033(癸丑年)的问题。

为方便起见,这里会用朔望月数(lunation number)来标纪朔。朔望月数由布朗于1933年所创,他把1923年的第一个朔(1923年1月17日2:41 UT1)的朔望月数定为1,此后的朔的朔望月数按时间次序定为2、3、4等等。已知1923年1月17日UT正午的儒略日数是2423437,由此可推断某个朔的朔望月数是最接近1+(JD-2423437)/29.5306的整数,其中JD是这个朔的儒略日数。


例 一: 推 算 N2017 (丁 酉 年) 的 所 有 农 历 月

根据英国皇家航海历书局及美国海军天文台编的 《2016年天象》,2016年的冬至是在12月21日UTC10:44,亦即12月21日18:44(UTC+8),所以2016年的冬至日是W2016=2016年12月21日。 又据《2017年天象》,2017年的冬至是在12月21日UTC16:28,亦即12月22日00:28(UTC+8),所以W2017=2017年12月22日。2016年和2017年的所有合朔时刻也可从两书查得,只是要把所有时刻从UTC转化为UTC+8。从两书的数据可得M-1=2016年11月29日、M11=2017年12月18日。由此算出
M11-M-1=384日,所以L=13,意味着S2017是闰岁。要找出闰月,需要知道中气的时刻,但那两本书只列出春分、秋分、夏至和冬至的时刻,其他中气时刻须自己推算。我已经把这些时间算好了,可从气朔时刻网页查看,该网页列出的时间全是UTC+8,不用转换。

下表列出朔和中气日期,朔用L然后加上朔望月数来纪。

中 气
L1162: 2016年11月29日
冬至: 2016年12月21日
L1163: 2016年12月29日
大寒: 2017年1月20日
L1164: 2017年1月28日
雨水: 2017年2月18日
L1165: 2017年2月26日
春分: 2017年3月20日
L1166: 2017年3月28日
谷雨: 2017年4月20日
L1167: 2017年4月26日
小满: 2017年5月21日
L1168: 2017年5月26日
夏至: 2017年6月21日
L1169: 2017年6月24日
大暑: 2017年7月22日
L1170: 2017年7月23日
L1171: 2017年8月22日
处暑: 2017年8月23日
L1172: 2017年9月20日
秋分: 2017年9月23日
L1173: 2017年10月20日
霜降: 2017年10月23日
L1174: 2017年11月18日
小雪: 2017年11月22日
L1175: 2017年12月18日
冬至: 2017年12月22日

从表中可见,L1170朔对应的农历月是唯一一个月份不含中气,是闰月。由此得出M0=2016年12月29日、M1=2017年1月28日、……、M6=2017年6月24日、M*6=2017年7月23日、M7=2017年8月22日、……、M11=2017年12月18日。闰月在六月之后的那个月,是闰六月。要推算丁酉年十一月后的月份,原则上应重复以上步骤计算下一岁(S2018)的农历月,但也可以省略,原因是我们知道农历有闰月的那一年有十三个月,现在头十二个月已定,而闰月是闰六月,所以最后一个月必定是十二月,初一是M11之后的朔日,下一年的正月初一必是M11之后的第二个朔日。2018年的朔日可从《2018年天象》查得。下表列出丁酉年各月的编排。

农 历 月初 一 日 期日 数
正月2017年1月28日29
二月2017年2月26日30
三月2017年3月28日29
四月2017年4月26日30
五月2017年5月26日29
六月2017年6月24日29
闰六月2017年7月23日30
七月2017年8月22日29
八月2017年9月20日30
九月2017年10月20日29
十月2017年11月18日30
十一月2017年12月18日30
十二月2018年1月17日30

农历月的日数由两个月初一日相隔的日数算出。例如四月初一在公历4月26日,五月初一在5月26日,由此可知4月27日是四月初二、4月28日是四月初三……5月25日是四月三十、5月26日是五月初一,所以四月有三十日,是大月。


例 二: 推 算 N2033 (癸 丑 年) 的 所 有 农 历 月

这里用我计算的朔和中气时刻来编算癸丑年的农历月,朔和中气时刻可从气朔时刻网页查得。根据气朔时刻网页的数据,W2032=2032年12月21日、W2033=2033年12月21日、M-1=2032年12月3日、M11=2033年11月22日,由此算出M11-M-1=354日,所以L=12,S2033没有闰月,所以其后的十一个月已定,不必理会S2033的其他中气。癸丑年正月初一是M-1之后的第二个朔日,是2033年1月31日,二月到十月的初一是其后的九个朔日,十一月初一是M11,即2033年11月22日。十一月之后的月份就要看S2034是否有闰月,如果有而且是在正月之前,则闰月属癸丑年。

从气朔时刻网页查得2034年冬至日在W2034=2034年12月22日,冬至日之前的朔日是M23=2034年12月11日。这里用M23来纪这个朔日,因为与其相关的农历月是从癸丑年算起的第二十三个平月。因为M23-M11=384日,所以L=13,意味着S2034是闰岁。现在要查看W2033后的中气和朔的日期,看看闰月是否发生癸丑年。因为癸丑年的头十一个月已定,我们只须看看W2033之后的几个中气和朔日就可知道闰月是不是在癸丑年。下表列出几个中气和朔日。

中 气
L1372: 2033年11月22日
冬至: 2033年12月21日
L1373: 2033年12月22日
L1374: 2034年1月20日大寒: 2034年1月20日
雨水: 2034年2月18日
L1375: 2034年2月19日

从表中看出L1373朔对应的农历月份是冬至后第一个没有中气的月份,所以是闰月,之前的那个月是十一月,所以是闰十一月,属癸丑年。确定了闰月后,S2034的其他月份也定了,十二月在闰十一月之后。下表列出癸丑年各月的编排。

农 历 月初 一 日 期日 数
正月2033年1月31日29
二月2033年3月1日30
三月2033年3月31日29
四月2033年4月29日29
五月2033年5月28日30
六月2033年6月27日29
七月2033年7月26日30
八月2033年8月25日29
九月2033年9月23日30
十月2033年10月23日30
十一月2033年11月22日30
闰十一月2033年12月22日29
十二月2034年1月20日30

异 常 的 年 份 N2033 (癸 丑 年)

若干人指出农历年N2033癸丑年是异常年份,以前很多编历者都弄错了这年的农历月份。但如果细看例二的计算,似乎看不出这年有何特异之处。比较例一和例二的计算,反而觉得例二的计算较为简单。要明白癸丑年为何异常,先看看下表列出的朔和中气的日期,其中很多日期在例二的计算中略去了。

中 气农 历 日 期
L1360: 2032年12月3日壬子年十一月初一
冬至: 2032年12月21日十一月十九
L1361: 2033年1月1日十二月初一
大寒: 2033年1月20日十二月二十
L1362: 2033年1月31日癸丑年正月初一
雨水: 2033年2月18日正月十九
L1363: 2033年3月1日二月初一
春分: 2033年3月20日二月二十
L1364: 2033年3月31日三月初一
谷雨: 2033年4月20日三月廿一
L1365: 2033年4月29日四月初一
小满: 2033年5月21日四月廿三
L1366: 2033年5月28日五月初一
夏至: 2033年6月21日五月廿五
L1367: 2033年6月27日六月初一
大暑: 2033年7月22日六月廿六
L1368: 2033年7月26日七月初一
处暑: 2033年8月23日七月廿九
L1369: 2033年8月25日八月初一
L1370: 2033年9月23日秋分: 2033年9月23日九月初一
L1371: 2033年10月23日霜降: 2033年10月23日十月初一
L1372: 2033年11月22日小雪: 2033年11月22日十一月初一
冬至: 2033年12月21日十一月三十
L1373: 2033年12月22日闰十一月初一
L1374: 2034年1月20日大寒: 2034年1月20日十二月初一
雨水: 2034年2月18日十二月三十
L1375: 2034年2月19日甲寅年正月初一
L1376: 2034年3月20日春分: 2034年3月20日二月初一
L1377: 2034年4月19日三月初一
谷雨: 2034年4月20日三月初二
L1378: 2034年5月18日四月初一
小满: 2034年5月21日四月初四

表中可见有三个农历月在八个月内不含中气:癸丑年八月、闰十一月和甲寅年正月,而且有两个月含两个中气:癸丑年十一月和十二月。一个农历月内出现两个中气的情况十分罕见,无中气的月份而不是闰月(「伪闰月」)的情况也是十分罕见的。其实可以看出「双中气」和「伪闰月」是会在相隔几个月内成双出现的。很多编历者弄错了月份编排,是因为有不少书籍和文章说农历月份的序数按月内的中气而定:含雨水的月份是正月、含春分的月份是二月、含谷雨的月份是三月等,而不含中气的月份定为闰月。问题是这三个无中气的月全都要闰吗?编历者或许察觉到在八个月内置三个闰月不合理,所以把最先出现的无中气月份,即癸丑年七月后的那个月定为闰七月,这就错了。伪闰月在N1984(甲子年)也出现过,但在真闰月之后,所以以最先出现的无中气月份为闰月的方法在该年没有出错。

以无中气的月份定为闰月这「伪法则」虽然大多数时候不错,但遇到伪闰月时就不灵了。至于「农历的月序按月内所含的中气而定」这「伪法则」在癸丑年也不灵了:癸丑年八月不含秋分、九月不含霜降、十月不含小雪、甲寅年正月不含雨水。如果遵从正确法则,癸丑年的月份安排没有什么奇特。如例二所示,从壬子年十一月到癸丑年十一月之间有十二个农历月,所以S2033是平岁,没有闰月,编排S2033的月份时不必理会中气日期,也懒得去查,编月份时也不知道(亦无须理会)其中一个月没有中气。到要处理十一月以后的月份时,发现S2034是闰岁,再看头几个中气日期,发现十一月之后那个月没有中气,所以是闰月,以后的月份也定下来了,不必看其他中气,所以不知道(亦无须理会)后面还有一个月没有中气。只要遵从正确法则,不存在任何问题。

那么这伪法则从何而来?其实这是顺治二年(1645年)历法改革前的法则。如二十四节气网页所述,顺治二年以前的 二十四节气用平气来定义,一个月最多只能有一个中气。可以推出闰岁只能有一个月不含中气,所以伪闰月也不存生。只要把十一月定为含冬至的月份,可推出十二月必含大寒,正月必含雨水等等。所以农历月序由月内中气决定,而无中气的月份定为闰月这规则在平气法下是没有问题的,但是改用定气法后就会碰钉。

由定气法所定义的二十四节气时间间隔并不相等,一个月有可能出现两个中气,虽然这情况很罕见。有双中气就有伪闰月,所以以前的法则不能再用,于是创制了法则五取代之前的无中气置闰法。

顺治二年的历法改革由德国传教士汤若望制定。新历法出现了双中气和伪闰月的情况,而且计算较为复杂,使当时的士大夫十分不满。前新加波国立大学数学系教授Helmer Aslaksen(现任挪威奥斯陆大学副教授)撰写了一篇介绍农历的文章,他指出当时中国的天文学不一定逊于西方,甚至认为当时没有一个西方传教士比得上元朝天文学家郭守敬,但是当时朝廷的中国天文官都是世袭,对自己传统的天文历法认识不深,在历法争议上辩不过西方传教士。汤若望制定的置闰法则现在仍在使用。


返回农历编算法则