三千年农历计算

在这农历戊戌年的年尾正好趁着放假花了点时间使用高精度的现代天文学模型推算了从公元前104年至公元3000年这三千余年的农历以及与中国农历相近的韩越日农历并以此为基础做了个万年历

从公元前104汉太初元年汉武帝的太初历施行至今两千余年来中国农历逐渐从基于规则排算的历法演变为了完全基于天文的历法[1]619唐武德二年戊寅元历弃平朔而采用定朔此后1645清顺治二年颁行的时宪历改平气为定气则成为了中国农历历法最后一次重大的改革所谓平朔平气就是假定日月运动是均匀的将所有的日月合朔节气人为均匀地排布而定朔定气则是从天文角度规定日月视黄经相等的时刻为太阳视黄经为15°整数倍的时刻为与平朔平气法相比定朔定气法的困难之处就在于如何高精度地计算日月位置现今通行的农历紫金历与清朝的时宪历一脉相承区别也仅在于紫金历吸收了现代天文学成果更为精确罢了

这里我使用了美国宇航局喷气推进实验室JPLDE431历表计算太阳与月球的位置再修正岁差章动等效应后得到太阳与月球地心视黄径的精确估计从而预测了公元3000年之前的所有农历日期与网上推算农历常用的VSOP87/ELP2000历表相比JPLDE系列历表更为精确当然这些历表得到的时间都是力学时DT而对于数百数千年后天体位置的预测而言力学时与我们平常使用的世界时UT之间的差距Δt的不确定性将成为影响农历日期估计的主导因素用什么历表反倒是次要的了

基本编算规则

根据2017年颁布的国家标准GB/T 33661-2017农历的编算和颁行现行农历的编算规则为

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

简单说只要确定了前一年的冬至再算出冬至前的首个朔日即前一年的农历十一月初一一个农历年基本也就定了下来当然如果遇到一年中包含13个月朔望月的情形还需要根据无中气置闰的原则设定闰月所以农历的排算主要在于如何计算节气包含中气与月相

计算过程

下面简单列出了基于DE431历表的农历推算过程[2]计算主要参考了1841年–2200年公曆和農曆日期對照 [3]以及Explanatory Supplement to the Astronomical Almanac一书这里仅列出了简要的过程具体可参见上述参考资料

  • 节气的计算
    • 对于平气法直接根据寿星天文历拟合的系数计算给定节气的UT时刻
    • 定气法的计算过程如下
      • 在任一质心力学时TDB时刻可忽略其与地球时TT间的误差根据DE431历表或同系列的其他DE历表可计算太阳在该时刻的天球坐标系GCRS位置修正光行时与光行差效应后得到太阳的地心视位置计算使用了Python程序包jplephem
      • GCRS坐标系转换为瞬时黄道坐标系并根据IAU2006/IAU2000A岁差章动模型[4]计算太阳的地心视黄经
      • 可使用牛顿法或其他求根算法得到给定节气的TDBTT时刻使得在该时刻太阳视黄经等于该节气所对应的太阳视黄经
      • 根据经验公式或历史闰秒列表将节气的TDB时刻转换为UTC时刻1972年前为UT1时刻
  • 采用上述算法计算前一年与本年的冬至定气法中为太阳视黄经270°日期
  • 分别计算两个冬至之前的合朔日期合朔计算类似节气计算定朔法中除了太阳的视黄经外还需计算月球的视黄经同样可使用牛顿法得到太阳与月球视黄经相等的合朔时刻对平朔法则与平气法一样直接使用参数计算这两个合朔日期对应前一年与本年的农历冬月初一从而确定了一[5] 计算两年的冬月初一之间所有合朔时刻可以得到期间的农历月朔望月数目当有12个农历月时不存在闰月冬月初一之后的第二个朔日为农历大年初一
  • 当两个冬月初一之间13个农历月时其中必定包含一个闰月此时需计算这13个农历月内的所有中气太阳视黄经为30°整数倍日期首个不含中气的月为闰月无中气置闰其计数与上个农历月相同三月后的闰月为闰三月如出现闰冬月或闰腊月[6]大年初一为冬月初一之后的第三个朔日

另外需要补充说明的是计算中为方便起见我统一使用了北京标准时间UTC+8即东经120°的平太阳时但历史上实际用的是观测当地的真太阳时而民国初年的新法天文夏历则使用了北京当地时即东经116°23'的平太阳时1929年之后的紫金历才正式开始使用北京时间

韩越日传统历法

作为东亚文化圈的成员日的历法也深受中国农历的影响三国目前的农历旧历都源于中国的时宪历区别在于韩国日本使用东九区时间而越南使用东七区时间日本旧历的推算规则与中国农历略有细微的不同我已另文叙述韩国越南农历的推算规则则与中国完全一致前述方法也同样适用于韩历与越南历只需将时间作相应转换即可

也正由于观测位置不同两国农历与中国农历对比偶尔会出现偏差2012壬辰年韩国为闰三月而中国则为闰四月根据程序计算的结果该年的中气小满为52023:15UTC+8而相邻的合朔为5217:47UTC+8由于东八区小满比合朔早一天521日开始的农历月没有中气因而置闰四月但在东九区小满与合朔同为521使得之前一个月缺中气因而置闰三月

类似地1985乙丑年越南历与中国农历出现过新年相差一个月的情况前一年的冬至为12220:23UTC+8合朔则出现在122219:47UTC+8对中国农历而言冬至与朔日为同一天因而新年为此后的第二个朔日1985220但对越南所在的东七区而言冬至为12211222日开始的农历月不包含冬至该月只能是腊月冬月初一需倒推到之前的1123而越南新年则是1222日之后的一个朔日1985121


  1. 其他历法中也有天文观测与规则排算并行的例子如伊斯兰历阴历和波斯历阳历都是基于天文观测的但表式伊斯兰历tabular Islamic calendar和波斯历2820683闰法则是基于规则排算的

  2. DE431历表用于定朔定气而对于历史上的平朔或平气我采用了寿星天文历拟合的参数

  3. 尤其是作者的月相和二十四節氣的計算一文包含了相关天文概念的简要介绍以及具体计算过程与模型公式等

  4. IAU2006/IAU2000A使用P03岁差模型代替原先IAU2000A模型的岁差部分2006IAU大会通过了使用该模型的决议

  5. 如冬至与合朔为同一天该日即冬月初一即便合朔的具体时刻晚于冬至时刻

  6. 不过采用定气法后闰冬月和闰腊月其实十分罕见尤其是闰腊月下一次将出现在千余年之后