返回农历编算法则
初稿: 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是这个朔的儒略日数。
根据英国皇家航海历书局及美国海军天文台编的 《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日是五月初一,所以四月有三十日,是大月。
这里用我计算的朔和中气时刻来编算癸丑年的农历月,朔和中气时刻可从气朔时刻网页查得。根据气朔时刻网页的数据,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癸丑年是异常年份,以前很多编历者都弄错了这年的农历月份。但如果细看例二的计算,似乎看不出这年有何特异之处。比较例一和例二的计算,反而觉得例二的计算较为简单。要明白癸丑年为何异常,先看看下表列出的朔和中气的日期,其中很多日期在例二的计算中略去了。
朔 | 中 气 | 农 历 日 期 |
---|---|---|
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(现任挪威奥斯陆大学副教授)撰写了一篇介绍农历的文章,他指出当时中国的天文学不一定逊于西方,甚至认为当时没有一个西方传教士比得上元朝天文学家郭守敬,但是当时朝廷的中国天文官都是世袭,对自己传统的天文历法认识不深,在历法争议上辩不过西方传教士。汤若望制定的置闰法则现在仍在使用。
返回农历编算法则