农历的编算

2020-08-24

公历,也就是现行的格里高利历,大多数人在小学的时候就学过,其规则也很简单。但是农历则不然,每一年春节似乎都在变动,和立春的日子根本不一样,却又总在它附近。而闰月更是让人摸不着头脑,每一个月都有可能称为闰月。

所以,这篇文章我就想写一写,农历是怎样编排出来的。

历法的三个变量

世界上的历法有很多种,大致可以分为阴历、阳历、和阴阳历。这些历法所用的,无非就是三个变量:昼夜周期(天)、地球公转周期(年)、月球盈亏周期(月)。注意,这里说的是月球的盈亏周期而不是公转周期。具体的原因后面再解释。

不同的历法会组合这三个变量。公历是一种阳历,选择了“天”和“年”,放弃了契合月球的盈亏周期。所以,公历中的月仅仅具有象征意义。伊斯兰历法是一种阴历,契合了“天”和“月”,而地球的公转则完全不管了。所以,伊斯兰历法和地球公转不匹配,伊斯兰的一些节日,可能会出现在任何一个季节。中国的农历选择了最难的模式:阴阳历。即,既要考虑月亮的盈亏,又要考虑地球的公转。

如何划定年

假如在地球上竖起一根杆子,记录杆子在白天时影子的长度,那么在中午十二点左右的某个时刻,影子会达到最短,这一刻就是正午。如果在温带,每天记录正午的影子长度,就会发现,一年当中:冬天的某一天,正午影长是最长的;夏天的某一天,正午影长是最小的。

这就是“冬至”和“夏至”的定义。两次冬至或者两次夏至之间,就是一年了。虽然地球上的人类无法从太空中俯视地球的移动,但是用这么一种简单的方法,连续测量很多年,我们就可以知道地球公转一周需要多少天。

中国古代的“圭表”,就是用来测定影子的长度从而划定“年”的。我们算出来的一年的长度,叫做“回归年”。

不过,这一切又没有这么简单,地球的运动还有“岁差”和“章动”。而且,这也不是什么新鲜的事物了,早在公元前二世纪就被古希腊天文学家所察觉。不过,对于本文来说,这些内容有些过于复杂了。

如何划定二十四节气

我们都知道有二十四节气,在上一节只提到了冬至和夏至。接下来就是怎么划定剩下的二十二个了。

早年的方法是非常简单粗暴的。既然冬至已经通过“回归年”计算出来了,那么把两次冬至之间的时间二十四等分成二十四个区间,也就有了二十四个节气。

这种方法被称为“平气法”,其实很粗糙,就是简单的除法运算,但是也够用了。因为地球的轨道是一个很近似圆的椭圆。所以地球的公转速度大致还算比较均匀。

第二种方式更加的精密:定下夏至和冬至之后,按地球在公转轨道上每转过15度角记一个节气。这种需要精确的天文观测和数学计算,需要用到一些近代数学的内容。该方法叫做“定气法”,是在明末才开始采用的,其中有外国的传教士协助,是基于托勒密天文学制定的。根据开普勒定律我们能知道,地球的公转轨道是椭圆,而且运转的速度是不均匀的,所以节气之间间隔的时间不完全一致。

二十四节气中,从冬至或者夏至开始,第一、三、五、七……个节气被称为“中气”,包括了夏至、大暑、处暑、秋分、霜降、小雪、冬至、大寒、雨水、春分、谷雨、小满。你会发现,在公历中,每个月固定会有两个节气,而月末的节气就是“中气”。这个定义在后面涉及闰月的时候会用到。

月亮周期

月亮的盈亏周期是29.5天,但是前面提到过,这并不是月球的公转周期。月球的公转周期是27.3天。月球在转到地球背朝太阳的一侧的时候达到满月,也就是“望”;在转到面朝太阳的一面的时候就看不到月亮了,这就是“朔”。所谓“物极必反”,完全看不到月亮的时间不会持续太久,很快,一丝月牙就会重新出现,所以“朔”这一天也会是新月出现的那一天。事实上,在天文学上,“月朔”和“新月”(英文:new moon)其实是同一个意思。本文当中也可能会交替使用这两个词。

当月球绕地球转了一周的时候,地球也绕着太阳走了一点距离。所谓,月球要稍微多走一点路,才能达到相对太阳的相同位置。所以,月亮的盈亏周期会比公转周期多一天。

根据农历的定义,“朔”这一天就是每一个月的初一。又因为盈亏的周期是29.5天,所以每一个农历月的时间在29天到30天不等。

越南和我们同一天过年吗?

越南也遵循传统使用农历,并且和中国基本相同。所以,农历新年被称为“Chinese New Year”的时候,越南互联网上还有一些反对的声音,很多英文媒体也因此把农历新年改作“Lunar New Year”。

不过,虽然使用的都是农历,但是越南却不一定和我们同一天过年。北京的时区在东八区,而越南的时区在东七区,有一个小时的时差。所以在特殊的情况下,相对北京时间,月朔会发生在午夜后,而相对河内时间,月朔会发生在午夜前。这样,正月初一的时间就会错开一天。因此,虽然我们和越南采用同样的历法,但是传统新年的日期却不一定相同。

“建子之月”、“建丑之月”、“建寅之月”

地支是以“子丑寅卯”开始的。如果你稍微了解一点生辰八字,就会发现,正月所对应的地支并不是“子”,而是“寅”。而“子”所对应的月份是十一月。月份和地支的这种对应关系也被称为“月建”。据称“建”是指北斗星所指的地方,十一月是“建子之月”,北斗星指向“子”这个位置。

我非常不喜欢这个说法,它过于玄学了。“建子”有更明显更深刻的含义,这也是农历作为阴阳历的重大特点:农历中规定,冬至必定位于“建子之月”。冬至这一天,刚好是一年中白昼最短、黑夜最长的一天。与之对应,十二时辰中的“子时”也是午夜。这种奇妙的遥相呼应,比用莫名奇妙的北斗七星定义要好多了。

春秋战国时,把哪一个月份作为正月是有争议的。有的地方用建寅,有的地方用建丑,有的地方用建子。据称,这三种正月分别是夏朝、殷朝、周朝的正月,称为“夏正”、“殷正”、“周正”。但是这种说法的真实性不可考证。秦朝又把“建亥”,也就是冬至前的那个月份作为一月。不过,在汉武帝年间,最终确定了“夏正”,也就是把“建寅之月”作为正月,“建子之月”也就相应地变成了十一月。

既然冬至在十一月,那么冬至之后的第一个月朔,就是腊月初一,冬至后的第二个月朔,就是正月初一,也就是春节。

所以,如果有人问起春节究竟是怎么确定的,你可以略带神秘,用占星家的口吻说:“冬至后的第二个新月”。不过,这种说法又并不总是准确,因为还有“闰月”。

置闰法

闰月是农历中最复杂的部分。一个回归年大致是365.2422天,而一个朔望月是 29.5天。如果一年记12个月,那么就只有29.5 × 12 = 354天。差不多每隔两三年就会和回归年偏差一个月。因此,当偏差发生时,就要增加额外一个月来补偿。这就是闰月。

农历的置闰法差不多分为三个阶段:

第一个阶段是“十九年七闰”。在先秦使用的就是这种历法。根据古人对朔望月周期和回归年的观察,每隔19年差不多就有7个闰月。但是这种方法是非常粗糙的。

汉代以后,通行的置闰方法是“无中气置闰”。前面提到了,二十四节气中有十二个间隔分布的“中气”。如果使用二十四等分回归年的“平气法”,每两个“中气”之间间隔30.43天。随着时间的推移,会出现有的月份没有中气,这时就置一个闰月。这个方法很好的兼顾了朔望月和回归年,计算也比较方便,因此一直施行到明末。

第三个阶段,在明末的《崇祯历书》和清初开始推行的《时宪历》中,农历进行了一次更大的升级,变成了今天的样子。

现代的农历

去读《时宪历》有点麻烦。所幸紫金山天文台在2017年参与制定了一部农历的国家标准《农历的编算和颁行(GB/T 33661-2017)》,对于农历如何置闰做了精确的描述。

  • 以北京时间为标准时间。
  • 朔日为农历月的第一个农历日。
  • 包含节气冬至在内的农历月为农历十一月。
  • 如果从某个农历十一月开始到下一个农历十一月(不含)之间有13个农历月,则取其中最先出现的一个不包含中气的农历月为农历闰月。
  • 农历十一月之后第2个(不计闰月)农历月为农历年的起始月。

这里面除了第一条“北京时间”是古代所没有的以外,其它都是和《时宪历》一脉相承的。

和之前的历法相比,《时宪历》有两个更新:第一个是制定节气的方法变了,从“平气法”变成了“定气法”,也就是说,从二十四等分一年来确定二十四节气,变成了地球绕太阳每公转15度为一个节气。定气法需要非常精确的测量和复杂的计算,而明末的时候,中国的天文学已经落后于欧洲了,需要传教士的帮助才有可能实现。因为地球是椭圆轨道,根据开普勒定律,不同季节的公转速度不同,所以节气间隔的天数变成了动态变化的14到16天。由此,置闰法也发生了变化,因为月相周期时间相对稳定而节气时间动态变化,所以无中气的月份变多了,不能再简单地用无中气置闰法,否则闰月会过量;因此置闰法也修改成了两个冬至之间含有13个农历月的时候才会加一个闰月。

从此,在农历中,年、月、日完全由天文观测确定:节气完全由地球公转确定,月份完全由月相周期确定,而年则是两者相辅相成,加上置闰法之后计算得出。在现代仪器的帮助下,二十四节气、朔望月、回归年的观测都可以精确到秒乃至毫秒级别。反而是现行的公历,因为没有根据天文观测调整的机制,会和回归年逐渐发生误差,几千年就会偏差一日。

2033年问题

虽然《时宪历》已经颁行了三百年,但是民间往往还因循守旧,使用古老的“无中气置闰法”。在大多数年份,这两者其实一样,但是因为种种细微的偏差,在 2033年,“无中气置闰法”和现代的农历置闰法会发生冲突。2033年比较特殊,这个农历年会有两个无中气的月份,分别是(原本的)八月和(原本的)十二月。如果按照“无中气置闰法”,那么(原本的)八月就会变成七月的闰月,也就是闰七月,但是因为从2032年农历十一月开始到2033年农历十一月之间只有12个农历月,而2033年的农历十一月到2034年的农历十一月之间才会有13个农历月,所以闰月应该放在这一年的第二个无中气的月份:十二月,让十二月成为闰十一月。而一些不采用现代置闰法的民间的“万年历”在这里就可能会有错误,这会导致中秋节偏差了一个月。

同时,这也是为什么说农历新年是“冬至之后的第二个新月”这样的说法不准确,因为如果出现了闰十一月或者闰腊月,那么新年就会变成冬至之后的第三个新月。



Email: i (at) mistivia (dot) com