巡星客
农历的详细推算过程
Popular ScienceFeaturedMay 20, 2026

农历的详细推算过程

一、引言

随着天文观测与计算爱好在国内的逐渐普及,越来越多的爱好者开始尝试自行编制农历。然而,网络上关于农历编制的资料往往叙述笼统或过于艰深,导致不少人对农历的计算方法存在诸多误解。

作为一名天文爱好者,笔者开发了一款能够计算1700年至3000年公历与农历对应关系的日历软件。在编制过程中,虽曾遇到不少困惑,但也由此深刻体会到中国传统历法的精妙——我们的祖先成功地将太阳历与太阴历融为一体,创造出世界上独一无二的阴阳合历体系。 

本文将以系统而全面的方,深入浅出地解析农历的编制原理,力求通俗易懂、引人入胜。相信在认真阅读之后,你一定能对农历编制方法形成清晰的认识,并从中获得启发。

 

二、农历的编制规则和说明

首先要明确历法的核心分类:以地球绕太阳公转的回归年周期(太阳周年视运动规律)为核心编制的历法,称为阳历(太阳历);以月球绕地球公转的朔望月周期(月相盈亏变化规律)为核心编制的历法,称为阴历(太阴历)。

我们日常使用的农历不等于阴历,它是一种兼顾日月运行规律的阴阳合历,巧妙融合了太阳与月亮的天体运动规律。其核心编制规则分为两大相辅相成的部分:一是以朔望月周期定农历月,确保月份与月相精准对应;二是以太阳回归年定年序、节气与置闰规则,让农历年贴合四季更迭的周期,实现了两种天体运行规律的协同统一。

(1)以月相定月:朔望月与农历月

农历以月相变化周期为依据,确定月份长度与每月起点。月相处于全黑状态的时刻称为朔,呈现满月的时刻称为望。经精确天文计算,朔与望本质是具体的天文时刻,而非一整天。

农历明确规定:只要某一天内发生朔时刻,无论具体时间(即便在当日23:59:59),该日均定为农历初一。

月亮从一次朔到下一次朔的时间间隔,称为一个朔望月。因月球公转轨道为椭圆形,在近地点运行速度快、远地点速度慢,同时受太阳、地球、金星、木星等天体引力共同影响,朔望月的实际时长在29.27~29.83天之间浮动,平均值约为29.53天。

因此,农历月份分为小月29天、大月30天两种,通过大小月交替排布,使历法月份与实际月相变化精准贴合。

需要注意一点,农历月份的大小并不完全以朔望月周期长短来确定,如当月的朔望周期为最长的29.83天,按照常规想象当月应该为大月,但是计算一下你会发现,当月也可能是小月,如:朔发生的时刻为1月1日的00:00:01秒,此时刻加上29.83天则为下一次朔发生的时刻,即1月30日19:55:13秒,由于1月30日当天已经发生朔了,当天只能定义为农历初一,于是当月只有29天为农历小月,同理,朔望月最短周期也可能是大月,也可能是小月。

(2)以太阳定年:二十四节气与回归年

现行的公历是纯太阳历,农历中的二十四节气,其发生时刻完全由太阳在黄道上的精确位置确定。我们把视觉上太阳一年的运行轨迹(天文学称黄道)划分为24等份,太阳每运行15°就对应一个节气。例如,太阳到达黄经45°为立夏,到达黄经135°为立秋。正因为节气直接对应太阳的真实位置,所以它能准确反映地球的公转状态与四季更替。

地球绕太阳公转一周的时间称为一个回归年,长度约为365.2422天。而日历不管怎么编排只能以整数天计量日期,公历平年按365天计算,每4年就会比回归年累计少将近1天,因此需要设置闰年来调整,让公历年始终贴合太阳的真实运行规律(误差也就是1-2天)。而二十四节气完全以太阳的黄经位置确定,因此节气的发生时刻,太阳一定处于对应的黄经位置。比如夏至的发生时刻,太阳一定运行到黄经90°的位置,无论夏至落在公历的哪一天,哪怕是发生在6月18日或者7月1日,只要是夏至日,当天的夏至时刻太阳黄经一定是在90°。

注:对于二十四节气来说,同一节气在不同年份的发生时刻差异极小,基本可以忽略不计;同一年内相邻两个节气的时间间隔虽有小幅波动,但整体相对稳定,这是因为地球绕太阳的公转轨道相对稳定。另外需要说明,上文关于夏至日期的假设是为了方便解释做的夸张比喻,实际公历通过闰年调整后,日期与太阳运行轨迹基本贴合,节气的公历日期仅有1-2天的小幅波动,夏至不会出现在6月18日或7月1日这样的极端日期。所以,节气是恒定的天文现象,变化的只是人为的历法刻度。

在二十四节气的计算方法上,现代农历采用定气法,即严格根据太阳在黄道上的实际运行位置来划分节气。由于地球的公转轨道为椭圆形,地球接近太阳(近日点)时公转速度快,远离太阳(远日点)时速度慢,太阳在黄道上的运行速度也会随之发生变化,因此定气法下相邻两个节气之间的时间长度并不相等。而受古代天文观测与计算技术的限值,无法准确追踪太阳的实施运行位置,因此直到1645年才正式将定气法确定为24节气的方法,在之前长期采用平气法。所谓平气法,就是将一个回归年的长度平均划分为24等份,以此确定每个节气的时间。定气法相对于古代沿用的平气法,完全贴合太阳的真实运行状态,精度大幅提升,能更准确地反映地球公转带来的四季寒暑变化。

(3) 阴阳调和:闰月的设置原理

现在我们来解答核心问题:如何将基于月亮运行的农历月,和基于太阳运行的回归年统一起来?

矛盾所在:一个回归年约为365.2422天,12个朔望月的平均时长约为29.5306 × 12 = 354.37天,两者相差约10.88天。如果只用12个农历月作为一年,每过三年,农历年就会比回归年提前大约一个月,四季就会在农历中错乱;而在合适的年份设置一个闰月,就能让农历年重新和回归年大致对齐。

那么,如何设置闰月呢?古人设计了一个巧妙的规则——无中气置闰法。二十四节气完全对应太阳的运行规律,古人把24节气分为节气和中气两类,二者相互交替,也就是一个节气、一个中气,再一个节气、一个中气,如此循环往复。

二十四节气中,排在奇数位的称为节气,分别是立春、惊蛰、清明、立夏、芒种、小暑、立秋、白露、寒露、立冬、大雪、小寒;排在偶数位的称为中气,分别是雨水、春分、谷雨、小满、夏至、大暑、处暑、秋分、霜降、小雪、冬至、大寒。

正常情况下,每个农历月都会包含一个交替出现的节气和中气,可两个天然的时间差,注定了中气会在农历月份里不断往后推迟,也催生了无中气置闰的规则:第一个是年时长的差距,12个农历月总时长只有约354.37天,比对应四季轮回的回归年(约365.2422天)短了将近11天,每年都差出这些时间,中气在农历里的日期自然会越推越晚;第二个更核心的是月与中气间隔的差距,两个相邻中气的平均间隔约30.44天,而一个完整农历月(朔望周期)的平均长度只有29.53天,说白了就是农历月本身的长度,比两个中气的间隔还要短约0.9天。造成中气会以每个月0.9天的速度持续向后偏移.如:今年的雨水中气在正月十五,明年可能就到了正月二十五,后年就跑到了二月初五,时间一长,必然会出现一个特殊的农历月:这个月从月初到月末,全程只赶上了一个节气,本该属于它的中气,直接落到了下个月的月初,这个从头到尾都没有中气的月份,就被定为前一个月的闰月,比如农历四月结束后,接下来的这个月没有中气、只有节气,那它就叫闰四月,而不是独立的农历五月。

很多人会疑惑,为什么增加这一个闰月,就能保证后面的农历月又能每个月都包含一个节气和中气、不会再持续偏移?这背后本质是月亮和太阳两个天文周期的数学对齐逻辑:之前每年农历年都比回归年短11天左右,累计两三年就差出了将近一个月的时间,中气也跟着往后飘了整整一个月,本来该对应五月的中气,飘到了本该是六月的位置;而我们加一个闰月,相当于给农历年多补了一个月的时长,把之前几年累计差出来的时间一次性填平了,同时也给飘出去的中气留出了对应的月份位置,把农历月份和中气的对应关系重新拉回了正轨,后面的中气就不会再继续累积偏移,自然每个农历月就又能稳定对应一个节气和一个中气了。至于大家担心的“会不会出现一年多闰”的情况,古人早就定下了两条铁规则彻底杜绝了这种可能:一是一个完整的回归年(从今年冬至到明年冬至)只有12个中气,就算这期间有13个农历月,也相当于13个盒子装12个苹果,最多只会有一个盒子是空的,也就是最多只会出现一个无中气的月份;二是古人明确规定冬至这个中气必须固定在农历十一月,这就把置闰的范围牢牢锁死了,绝对不会出现年初、年末各有一个无中气月的情况,所以一年最多只会闰一个月,绝不可能出现一年多闰的情况。

为什么这个方法能实现阴阳历的平衡?

我们可以这样理解:设置闰月,相当于在必要的年份里安排了13个农历月,这一年的总时长约为29.5306×13=383.9天,比回归年多出18天多。这个多出来的闰月,正好补偿了之前几年积累起来的时间差(每年约差11天,累计两三年就差出近一个月)。通过十九年七闰的大致周期(即在19个农历年中加入7个闰月,这是自然形成的统计周期而非强制标准),农历年的总长度就和19个回归年的总长度几乎相等,从而实现农历月份与四季寒暑的长期同步,不会出现冬夏倒置的情况。

总而言之,农历通过朔望月确定日期与月相的精准对应,通过二十四节气把握太阳运行规律,再通过无中气置闰的规则巧妙地调和了阴历与阳历的周期差,使其成为一种科学、精密且充满东方智慧的历法。

 

三、农历的编制具体实现方法

基于前面我们梳理完成的农历编制理论基础,接下来我们就可以落地讲解农历的实际编排方法。在正式开始前,必须先明确一条农历编制的核心硬性规则,这是古人定下的不可突破的红线:冬至节气必须落在农历十一月

这条规则,是农历能和四季寒暑稳定对应、不会出现月份与季节脱节的核心保障。我们知道,在公历中的日期非常固定,基本都在每年的12月21日或22日。把冬至牢牢锁定在农历十一月,就相当于给农历的月份偏移设下了硬性边界——冬至最早只能是农历十一月初一,最晚只能是农历十一月三十,绝对不能提前到十月、延后到十二月,这就保证了农历十一月永远和太阳运行的冬季时段对应,最大时间偏差不会超过一个月。

也正是因为这条红线规则,农历正月初一的日期就被自然限定在了公历1月20日至2月20日之间。这样一来,农历新年就永远和立春时节(公历每年2月3日-5日)基本对应,保证了春节始终处在冬去春来的岁首节点,不会出现正月初一过早跑到公历1月上旬、或者过晚拖到3月的情况。

根据以上理论,为了简化编排难度,我们可以不沿用传统从冬至所在的农历十一月开始编排的常规方法,转而以正月初一作为编排起点。

同时通过上述知识的学习,我们很容易想到,编制农历,核心在于掌握两个关键的天文算法:

一是计算太阳在黄道上的精确位置(用以确定二十四节气);

二是计算月亮的‘朔’发生的精确时刻(用以确定每个农历月的初一)

(1)太阳黄经的计算:定位二十四节气

太阳黄经的计算,本质上是一个精密的天文拟合问题。天文学家通过长期观测数据,建立了一套复杂的数学模型,可以计算出任何给定时刻太阳在黄道上的精确位置。

这里有一个有趣的问题:既然公历日期需要通过闰年来修正以贴合太阳年,那么它如何能与太阳位置建立稳定的函数关系呢?答案是借助一个不受年、月限制的纯线性时间标尺——儒略日。

儒略日是一个连续的日期数值记录方式,如今天的儒略日是2450000,那么明天就是2450001,再过一年就是2450365,继续再过一个闰年那么就是2450365+366=2450731。很明显儒略日的计数它完美地规避了公历大小月、闰年等不规则因素,为天文计算提供了统一的时间基准。以儒略日作为横坐标,天体位置作为纵坐标,这样就可以通过观测绘制天体的坐标图,进而再拟合出天体的轨道计算模型,如下图所示:

很明显采用儒略日来计量和天体位置能构成函数关系,而采用现行的日历作为横坐标是无法实现的。并且需要说明的是,虽然儒略日是一个连续的时间,但是在具体使用的时候还会专门的公式进行微调秒,以后在专门的章节中会继续说明,这里不再赘述。

算法一、太阳位置的确定,具体计算步骤简述:

  将待计算的公历日期时间,转换为天文计算通用的连续线性时标儒略日,消除公历历法的不规则性对计算的干扰。

  以转换得到的儒略日为基准,计算对应时刻太阳的“平黄经”,即忽略天体摄动影响时,太阳在黄道上的理想平均位置。

  对平黄经进行多阶精密修正,核心包括地球轨道偏心率校正、日月引力引发的章动修正、行星摄动校正、周年光行差修正等,消除理想模型与实际天体运行的误差。

  完成全部修正后,最终得到该时刻太阳的“真黄经”,即太阳在黄道上的实际视位置,为二十四节气的精准判定提供核心天文基准

如何由黄经反推节气日期?

虽然已知日期求黄经是直接计算的,但我们更需要的是:已知一个特定的黄经值(例如黄经270°对应冬至),求出其对应的准确日期。由于已知黄经计算日期这个是非常困难的(相当于逆函数),这需要通过数值方法(如内插法)来逼近。

内插法计算流程:

  先估算一个接近的起点日期A,计算其太阳黄经X1。

  将日期A稍作推移得到日期B,计算其黄经X2。

  假设在这个极短的时间内,太阳黄经匀速变化,则变化率 k=(X2-X1)/(B-A)。

  设目标黄经为X0,其对应日期P可通过公式 P=B+(X0-X2)/k 估算。

  将估算出的日期P代入公式,计算其实际黄经X3。

  比较X3与目标X0的差值,如果误差较大,则将P作为新的起点,重复步骤2-5进行迭代,直至结果满足精度要求。

通过此方法,我们就能精确算出一整年中所有节气(如立春、惊蛰)和中气(如雨水、春分)发生的准确时刻,将这些时刻一一列举出来,后期编排农历需要用到,为了节省时间,可以只列举中气出来,如下所示:

大寒   01月22日   01:01:13

雨水   02月20日   15:15:07

春分   03月22日   05:26:23

谷雨   04月21日   08:35:59

小满   05月22日   19:10:17

夏至   06月22日   02:47:33

大暑   07月24日   12:08:23

处暑   08月24日   09:10:41

秋分   09月24日   17:12:42

霜降   10月24日   14:48:25

小雪   11月23日   03:25:36

冬至   12月23日   21:15:17

大寒   01月21日   09:12:05

(2)月亮朔日的计算:确定农历初一

“朔”是月亮运行到太阳和地球之间,从地球上看不见月亮的时刻,它标志着一个农历月的开始。计算朔日同样依赖复杂的天文模型(公式基于Chapront’s ELP-2000/82月亮理论),其公式包含多个修正项,以精确拟合月球受到地球、太阳及其他行星引力影响的复杂轨道:

算法二、朔时刻的计算,具体计算步骤简述:

  给定待计算的公历日期A,先将对应民用时间转换为天文计算通用的地球时(TT)以消除闰秒误差,再按标准天文公式转换为连续线性的儒略日时标,为月球轨道参数计算提供统一、无历法规则干扰的时间基准。

  以转换得到的儒略日为基准,以J2000.0标准天文历元为起算点,依次计算对应时刻的太阳平近点角、月球平近点角、月球黄纬相关的轨道纬度参数,为月球位置与月相计算提供核心基础轨道要素。

  计算月球轨道升交点黄经,同步求解日月平黄经差值,推导得到真月相(视月相)的核心修正参数,锚定朔时刻(日月视黄经严格相等)的计算基准。

  依次完成月球轨道偏心率校正、日月引力摄动修正、行星摄动修正与视位置校正,通过数值迭代逼近,精准求解出与公历日期A最接近的朔时刻对应的儒略日数值。

  将朔时刻对应的儒略日数值反向转换为标准公历日期与民用时间,得到朔发生的精确时刻,为农历初一的判定提供核心天文依据。

显而易见,给定任意一个公历日期,通过上述算法计算后,都能得到该日期附近最近的朔日精确发生时刻。举个例子:若某次朔日的精确时刻为1月23日22:48:13,那么无论我们给定的是1月24日、1月26日还是1月28日,通过算法计算,得到的最近朔日时刻都是1月23日22:48:13——这是因为两个相邻朔日之间的所有公历日期,对应的最近朔日均为前一个朔时刻,直到下一个新的朔日到来。

当我们算出第一个朔日时刻后,可将该时刻叠加朔望月平均时长29.53天作为估算起算点,再通过上述算法进行精确求解,就能得到下一个朔日的发生时刻;以此类推循环迭代,就能得到任意时间范围内所有“朔”发生的精确时刻列表。经笔者实践验证,该算法可支持大时间跨度的稳定计算,即便向后推算数百年上千年,也能保证结果的精准可靠。

示例朔日时刻列表如下:

12月25日   13:25:01

1月23日   22:48:13

2月22日   08:15:34

3月24日   09:41:20

4月22日   18:07:45

5月21日   14:29:08

6月19日   01:55:37

7月19日   08:05:06

8月17日   02:35:19

9月16日   19:27:14

……

同样将这些时刻一一列举出来,后期编排农历需要用到。

注意:相邻两个“朔”之间的天数,就是该农历月的实际长度,可能是29天(小月)或30天(大月),这个长度是自然计算的结果,并无固定规律。

(3)农历的最终编排:合二为一

现在,我们将太阳和月亮的计算结果结合起来,完成农历的最终编排。

第一步:确定正月初一

从计算出的“朔日”列表中,选出落在公历1月20日至2月20日之间的那个“朔”。这一天,就被定为农历正月初一。上面的列表中,正月初一只能是1月23日。否则12月25日及2月22日偏离的太多了。

第二步:顺次排列月份,并判断是否置闰

  从正月初一开始,每个“朔日”都是下一个月的初一。

  关键规则来了:检查每个农历月(从本月初一到下个月初一之间)是否包含一个“中气”。

如果包含中气:则该月为正常月份(如正月、二月…)。

如果不包含中气:则该月被定为闰月,沿用前一个月的月序,称为“闰X月”。

注意:为什么用“中气”而不用“节气”来判断?

理论上用哪一个都可以。但传统历法规定使用“中气”作为判断标准,这已成为惯例。因为12个中气与回归年有更直接的对应关系,能更稳健地确保农历年与四季同步。

编排示例:

正月(初一:1月23日~2月21日):此月内含“雨水(2.20)”中气 → 正常月份。

二月(初一:2月22日~3月23日):此月内含“春分(3.22)”中气 → 正常月份。

三月(初一:3月24日~4月21日):此月内含“谷雨(4.21)”中气 → 正常月份。

四月(初一:4月22日~5月20日):此月内无中气 → 定为闰四月。

闰四月(初一:5月21日~6月18日):此月内含“小满(5.22)”中气 → 接下来的月份恢复为正常五月。

五月(初一:6月19日~7月18日):此月内含“夏至(6.22)”中气 → 正常月份。

六月(初一:7月19日~8月16 日):此月内含“处暑(7.24)”中气 → 正常月份

……

通过这套规则,我们成功地将基于月亮的“月”和基于太阳的“年”融合在一起。即使个别年份的月份数不同(平年12个月,闰年13个月),从长远来看,农历的年份长度与回归年保持了高度一致。

注意:当中气与朔日发生在同一天时,需依据二者的具体发生时刻界定中气归属,而非简单按日期划分,若中气发生在朔日时刻之前,则该中气归属于上一个农历月。如:若朔日发生于当日 14:01,而中气发生于当日 10:05分,因中气时刻早于朔日时刻,此中气应归入上一个农历月。

同时还要强调:普通人常用的天文算法普遍存在误差(如2秒误差),这种微小误差在特定时段可能导致日期推算出现1天偏差,需通过人为干预修正。比如:当算法计算出的朔日或节气时刻为 23:59:59(当日深夜),而实际准确时刻为次日 0:00:01(次日凌晨)时,2 秒误差会直接导致日期判定偏差一天。而且这种误差在大时间跨度的天文计算时,发生频率还不低,需要高度重视这些点。

 

四、结语

看完上面的计算过程大家就会发现,编排农历其实一点都不复杂,最核心的工作,就是算准两组关键的天文时间数据:一组是所有农历初一对应的朔日精确发生时间序列,另一组是全年24节气的精确发生时间序列。只要拿到了这两组精准数据,对照农历的固定编排规则,就能顺利完成农历年历的排布了。

当农历计算的层层面纱被逐一揭开,你就会发现,它的背后从来都不是什么玄虚的学问,而是一套完全贴合天体运行规律、逻辑严谨的精密天文计算体系。如果你也想亲手编制一套属于自己的农历,核心只需要攻克两大关键:一是精准计算太阳黄经,以此锚定全年的节气与农历的年度四季周期;二是精准测定月亮的朔日时刻,以此确定每个农历月的月初起点。(关于这两套算法的完整、详细计算实操,我们会在后续的文章中专门拆解讲解,此处就不再展开赘述了)。一旦掌握了这两项核心算法,你就能化身“业余天文学家”,亲手一步步推演农历的完整诞生过程,真切感受天体运行与传统时间计量之间的深层联结。

Comments (0)

No comments yet.