算法详解:如何计算中国农历
算法详解:如何计算中国农历
中国的农历年历推算基于天文算法,通过计算节气时间和日月合朔时间来确定农历日期。本文将详细介绍这一过程,包括星历表的应用、朔望月的计算以及农历与公历的对应关系建立。
天文算法基础
所谓的“天文算法”,就是利用经典力学定律推导行星运转轨道,对任意时刻的行星位置进行精确计算,从而获得某种天文现象发生时的时间,比如日月合朔这一天文现象就是太阳和月亮的地心黄经(视黄经)差为0的那一瞬间。能够计算任意时刻行星位置的一套理论就被称为星历表,比较著名的星历表有美国国家航空航天局下属的喷气推进实验室发布的DE系列星历表,还有瑞士天文台在DE406基础上拓展的瑞士星历表等等。根据行星运行轨道直接计算行星位置通常不是很方便,更何况大多数民用天文计算用不上那么多精确的轨道参数,于是天文学家在这些星历表的基础上推导出了很多可以做简便计算,但是又能保证一定精度的行星运行理论,比较著名的有VSOP82/87太阳系行星运行理论和ELP-2000/82月球运行理论,这两套理论在精度上已经很接近DE系列星历表了。关于如何应用这两套伦理进行天文历法计算,请参考“日历生成算法”系列文章的第三篇《用天文方法计算二十四节气》和第四篇《用天文方法计算日月合朔》,本文介绍的农历年历推算是在已经通过天文算法获得了精确的节气时间和日月合朔时间的基础上进行的。
农历与公历的对应关系
中国的官方纪时采用的是中国公历(格里历),因此农历年历的推导应以公历年的周期为主导,附上农历年的信息,也就是说,年历以公历的1月1日为起始,至12月31日结束,根据农历历法推导出的农历日期信息,附加在公历日期信息上形成双历。通常情况下,一个公历年周期都不能完整地对应到一个农历年周期上,二者的偏差也不固定,因此不存在稳定的对应关系,也就是说,不存在从公历的日期到农历日期的转换公式,只能根据农历的历法规则推导出农历日期与公历日期的对应关系。由农历历法规则可知,上一个公历年的冬至()所在的朔望月是上一个农历年的十一月(冬月),所以在进行节气计算时,需要计算包括上一年冬至节气在内的二十五个节气,才能对应上上一个农历年的十一月和当前农历年的十一月。在计算与之对应的朔日时,考虑到有闰月的情况,需要从上一年冬至节气前的第一个朔日,连续计算15个朔日才能保证覆盖两个冬至之间的一整年时间,图(1)显示了2011年没有闰月的情况下朔日和冬至的关系:
图(1)没有闰月情况下朔日与冬至节气关系图
图中上排数字是公历月的编号,黑色圆点代表朔日,黑色三角形代表冬至节气。图(2)显示了2012年有闰月的情况下朔日和冬至的关系:
图(2)有闰月情况下朔日与冬至节气关系图
通过计算得到能够覆盖两个冬至节气的所有朔日时间后,就可以着手建立公历日期与农历日期的对应关系。以图(1)所示的2011年为例,首先根据计算得到的15个朔日(2011年只会用到其中的前14个时间)时间,建立与2011年(公历年)有关的朔望月关系表:
朔日编号 | 合朔时间 | 对应公历日期 | 月长 | 月名 |
---|---|---|---|---|
1 | 01:35:39.90 | 2010-12-06 | 29 | 冬月 |
2 | 17:02:34.26 | 2011-01-04 | 30 | 腊月 |
3 | 10:30:42.67 | 2011-02-03 | 30 | 正月 |
4 | 04:45:59.44 | 2011-03-05 | 29 | 二月 |
5 | 22:32:15.13 | 2011-04-03 | 30 | 三月 |
6 | 14:50:31.79 | 2011-05-03 | 30 | 四月 |
7 | 05:02:32.51 | 2011-06-02 | 29 | 五月 |
8 | 16:53:54.10 | 2011-07-01 | 30 | 六月 |
9 | 02:39:45.06 | 2011-07-31 | 29 | 七月 |
10 | 11:04:06.43 | 2011-08-29 | 29 | 八月 |
11 | 19:08:50.09 | 2011-09-27 | 30 | 九月 |
12 | 03:55:54.64 | 2011-10-27 | 29 | 十月 |
13 | 14:09:40.97 | 2011-11-25 | 30 | 冬月 |
14 | 02:06:27.05 | 2011-12-25 | 29 | 腊月 |
15 | 15:39:23.99 |