农 历 编 算 法 则

初稿: 2018年10月     最近一次重大修订: 2019年4月


中国自公元1912年(民国元年)起采用公历(即格里高里历),但是传统的农历仍在民间使用,而且大多数传统节日及公众假期仍依照农历,所以有必要对农历有基本认识。本网页旨在简单介绍农历的编算法则。坊间有不少谈论历法的通俗书籍可供有兴趣的读者参阅,例如唐汉良先生的《历书百问百答》唐汉良


内容

  1. 引 言
  2. 重 要 概 念
    1. UT1, UTC, 中 国 标 准 时
    2. 农 历 的 纪 年、纪 月 和 纪 日 法
    3. 中 气 和 岁
  3. 现 代 农 历 的 编 算 法 则
  4. 农 历 编 算 例 子
    1. 例 一: 推 算 N2017 (丁 酉 年) 的 所 有 农 历 月
    2. 例 二: 推 算 N2033 (癸 丑 年) 的 所 有 农 历 月
    3. 异 常 的 年 份 N2033 (癸 丑 年)
  5. 农 历 法 则 之 疑 惑
    1. 兼 顾 阴 阳 两 周
    2. 十 九 年 七 闰 法 之 谜
    3. 农 历 年 月 的 平 均 日 数
  6. 《农 历 的 编 算 和 颁 行》: 2017 年 国 家 标 准 (GB/T 33661-2017)

    备注和参考文献


引 言

历法是为了纪录时间而制。在古代,有三个周期对人们日常生活很重要:昼夜交替的周期、月亮盈亏的周期和季节交替的周期。昼夜交替的平均时间是平太阳日。月亮盈亏的周期是朔望月,其平均值是29.5306日。季节交替的周期是回归年(古代称「岁实」),可由两冬至或两春分的平均时间以定,其值为365.2422日注一。「日」的概念缘自昼夜交替,「月」的概念缘自月亮盈亏,「年」或「岁」的概念缘自季节交替。

历法要解决的其中一个重要问题是怎样编排年月日。上述三个周期彼此之间的比例都不能约化成简单分数,这使编制历法颇为困难。其中一个办法是不理会朔望月,只考虑回归年,年和月按特定规律编排,使一年的平均周期近似回归年,这样的历法称为「太阳历」,简称「阳历」,公历就是一种阳历。另一个办法是不理会回归年,年和月按特定的规律编排,使一个月的平均周期接近朔望月,这样的历法称为「太阴历」,简称「阴历」,伊斯兰历就是一种阴历。第三个办法是要同时兼顾朔望月和回归年,年和月按特定的规律编排,使一个月的平均周期接近朔望月,一年的平均周期接近回归年,这样的历法称为「阴阳合历」,简称「阴阳历」,农历就是一种阴阳历。

农历规定把朔(即新月)落在的那一日定为某月初一。朔望月的平均值是29.5306日,所以农历一个月可以有二十九日,称为小月,也可以有三十日,称为大月。月大月小是根据两朔日之间的日数而定。回归年的周期是365.2422日,是朔望月平均值的12.37倍,所以农历一年一般有十二个月。为使农历不偏离回归年的周期,约每三年需有一个「闰月」,即一年有十三个月。

安置闰月以使农历一年平均周期接近回归年,即「置闰法则」,是农历要解决的重要问题。历代用过很多不同的置闰法则,有过五次重大的历法改革,最近一次重大改革发生在清顺治二年(公元1645年)。这里只谈现在通用农历的法则,谈法则之前须先阐释对编算农历来说重要的天文和历法概念。


重 要 概 念

要深入了解现代农历的编算,得从现代的时间计量说起。


UT1, UTC, 中 国 标 准 时

世界时(UT)是根据地球自转制定的时间。世界时有几种不同版本,最常用的是UT1和协调世界时(UTC)。UT1是先根据地球上某一特定的经线注二相对于遥远恒星的方位,再通过简单变换得出符合平均太阳时的时间标准。地球自转不均匀,所以UT1的时间也不均匀,这使UT1在应用上有所不便,于是人们创立协调世界时UTC来取代UT1。

协调世界时UTC是由国际原子时TAI及UT1而定。国际原子时是根据遍布世界上超过五十个国家、超过四百台原子钟的时刻经过数据处理而定的时刻,由TAI所定的每一秒钟都是均匀的。UTC则定为TAI加上整数秒,使之与UT1的偏差不超过0.9秒。所以UTC的一秒和TAI的一秒时间间隔完全一样,当UTC与UT1的时刻相差快要超过0.9秒时,闰秒便会加到UTC上,闰秒可正可负,正闰秒的一分钟有六十一秒,负闰秒的一分钟只有五十九秒。到目前(2024年1月)为止的闰秒全是正闰秒。闰秒法则从1972年实施,到目前为止总共加了二十七个闰秒,上一次闰秒是在2016年12月31日23时59分60秒UTC。所以UTC在大多数的时候是均匀的,只是在加闰秒时会有一秒的突变,这些突变有时会造成混乱,因此UTC政策在2035年或更早会有重大调正。CGPM27

区时定为与协调世界时UTC相差某个特定的时间,是世界各国采用的时间系统。现在中国各地采用的时间是东八区的区时,与UTC数字上相差八小时(例如东八区9:00相当于 UTC 1:00 ),一般以UTC+8表示,也称为北京时间或中国标准时。现在的农历就是以UTC+8为时间基础。


农 历 的 纪 年、纪 月 和 纪 日 法

农历现在以干支纪年。月份以正月、二月、三月……十二月表示,闰月取前一个月的月数在前面加上「闰」字,如闰三月、闰九月等。农历每月第一日到第十日依次纪为初一、初二……初十,第十一日到第二十日依次纪为十一、十二……二十,第二十一日到第二十九日依次纪为二十一、二十二……二十九,或者简纪为廿一、廿二……廿九,第三十日纪为三十。农历也可用干支来纪日期,但月份一般不用干支。

众所周知,以前中国常以帝王年号纪年,这种纪年方法到清朝灭亡后废除。中华民国虽然用「民国」纪年,但民国纪的是公历年而非农历年,例如民国元年是指公元1912年,不是农历壬子年。


朔是指月亮与太阳在同一方向的时刻,这说法过于笼统,现代天文学把朔定义为月球地心视黄经λM与太阳地心视黄经λS相等的时刻。与朔相关的概念有上弦、望和下弦。上弦是λM-λS=90°的时刻;望是λM-λS=180°的时刻;下弦是λM-λS=270°的时刻。笼统地说,上弦是月亮位於太阳以东90°的时候;望是月亮在太阳的相反方向的时候;下弦是月亮位於太阳以西90°的时候。

朔所在的日期称为朔日。中国一直以来以午夜零时(古时称子正)作为一天的开始,所以不论朔发生在某天的00:00:00或23:59:59.999,朔日仍视为同一天。值得注意的是现在农历以UTC+8为时间基础,例如朔曾发生在公元2010年12月5日UTC17:36,换成UTC+8区时,这次朔发生在2010年12月6日的01:36,所以这次朔日是在2010年12月6日。

农历有一条古老法则一直沿用至今:朔日定为某月的初一日。所以2010年12月6日必是某月的初一日,下面要说的另一法则把此朔日定为十一月初一。下一个朔日发生在公元2011年1月4日,所以下一个月的初一是2011年1月4日。2010年12月6日和2011年1月4日之间有二十九日,由此推出这个十一月是小月。


中 气 和 岁

二十四节气网页所述,中国古代用二十四节气来表示太阳在黄道的位置。二十四节气又分为十二个中气和十二个节气:自立春算起,单数的称为节气,双数的称为中气。现代天文把中气定义为太阳的地心视黄经达到30°的整数倍的时刻。

冬至是其中一个中气,在农历编算中相当重要。如六十干支网页所述,冬至所在的月份定为建子。自汉武帝太初元年(即公元前104年)以来的历代各朝一般以建寅为正月,所以建子是十一月,由此可知含冬至的月份必定是农历十一月。例如2010年的冬至时刻是12月22日07:38(UTC+8),上面提到2010年12月6日和2011年1月4日皆是朔日,故此以2010年12月6日为初一的月份含有冬至,所以是该月是十一月。

二十四节气网页又指出「岁」与「年」在农历是严格分开的。一岁是指从冬至到下一个冬至的时间。「岁」又可以指从建子月的初一日到下一个建子月之前的一日,即由十一月初一到下一个十一月初一前一日那段时间。一岁有十二或十三个月。为方便起见,这里称含十二个月的岁为「平岁」,称含十三个月的岁为「闰岁」。农历有一条重要法则:在闰岁的十三个月中,其中的一个月要定为闰月。

平岁的月份编排很简单。如前所述,含冬至的那个月定为十一月,以后的十一个月依次定为十二月、正月、二月……十月。所以在平岁中正月是十一月(建子)后的第二个月,正月初一是冬至日后的第二个朔日。

闰岁的情况稍为复杂。一岁有十二个中气,闰岁有十三个月,所以至少有一个月不含中气,农历规定冬至后第一个不含中气的月份定为闰月。为方便起见,这里且称非闰月的月份为「平月」。在闰岁中含冬至的月份定为十一月,其余十一个平月依次定为十二月、正月、二月……十月,闰月取前一个月的月数在前面加上「闰」字。在闰岁中正月是十一月以后的第二个平月。


现 代 农 历 的 编 算 法 则

重要概念都说完了,现在要总结现代农历的编算法则。下面列出的法则是根据中华人民共和国国家质量监督检验检疫总局和中国国家标准化管理委员会联合发布的《农历的编算和颁行》文件国标(编号GB/T 33661-2017),这文件是2017年5月由中国科学院紫金山天文台拟定。以下用《国标》简称这文件。

除了法则一和法则五外,其他法则基本上是继承古制。法则四和法则六其实就是「含冬至之月为建子,以建寅为正月」的另一写法,这写法取自《国标》,显然是为了避谈月建,却不免使不熟识中国历法者感到有点莫名其妙。法则五是顺治二年(1645年)历法改革时制定的,稍为修改了之前的「无中气」置闰法则。法则一是1928年才加上的。

现在,法则一其实是说算农历时应用UTC+8作为标准时。但是UTC在1960年制定,经过多次修改,到1972年才定下来。为了避免混乱,本网站所列的时间在1972年以前是UT1+8,从1972年起才用UTC+8。这其实几乎没有什么关系,本网站列出的时间只列到分钟,UT1和UTC在1960年和1971年间最多只有几秒之差。

法则一到1929年起才实施,1929年前的时间以北京地方时为准,北京的经度是116°25',与东经120°标准时相差约十四分钟。如果朔或节气时刻接近午夜零时,十四分钟之差可以使朔日或节气之日有一日之差。例如有朔发生在公元1916年2月4日0:05(UT1+8),按北京地方时这朔发生在2月4日午夜前,所以朔日是2月3日,这朔日正好是农历丙辰年的正月初一,所以中国在1916年2月3日庆祝农历新年,而不是2月4日。

从上述法则可制定编算农历的方法,下面列出的方法可用来编定一岁内的所有农历月,即从某年十一月到下一年十月的所有农历月日。为方便起见,以下用NY表示年首最接近公历Y年1月1日的农历年,例如N1984指农历甲子年,始于公元1984年2月2日,终于1985年2月19日。用WY表示落在公历Y年的冬至日期,SY则表示从NY-1的建子月到NY建子月之前一日的那段时间,即农历的岁。

  1. 计算两冬至的日期WY-1WY

  2. 计算在WY-1或之前的第一个朔日M-1和在WY或之前的第一个朔日M11

  3. 求从M-1M11之间的朔的数目LY(包括M-1但不包括M11),LY是最接近(M11 - M-1)/29.53的整数。

    1. 如果LY=12,则SY是平岁。计算M-1之后的十一个朔日,依次标以M0,M1,……,M10

    2. 如果LY=13,则SY是闰岁。计算M-1之后的十二个朔日及在SY内的所有中气日期,然后找出最先出现不含中气的月份,这个月份便是闰月。把平月的朔日日期依次标以M0,M1,……,M10,闰月的朔日日期则标以M*i,这里i是闰月之前那个月的编号。

  4. M-1是农历年NY-1的十一月初一,M0是十二月初一,M1是农历年NY的正月初一,M2,……,M10是农历年NY的二月初一,……,十月初一。如果有闰月,闰月的初一是M*i

上述程序定出从农历年NY-1的十一月到农历年NY十月的月日编排,如想推算农历年NY的其余月份,就要重复以上步骤来计算下一个岁SY+1的农历月份。


农 历 编 算 例 子
农 历 法 则 之 疑 惑
《农 历 的 编 算 和 颁 行》: 2017 年 国 家 标 准 (GB/T 33661-2017)

上面说到2017年5月中国科学院紫金山天文台拟定了《农历的编算和颁行》文件国标(编号GB/T 33661-2017),由中华人民共和国国家质量监督检验检疫总局和中国国家标准化管理委员会联合发布。这《国标》文件的出现,应该和下面的历史有关。

多年来,《万年历》在民间很流行。据中国科学院紫金山天文台编的《新编万年历(修定本)》新编万年历和刘宝琳编的《100年袖珍干支月曆》刘宝琳所述,《万年历》是由清朝钦天监所编,正式书名是《御定万年书》。第一部《万年历》在乾隆年间编成,年限是从清太祖天命九年(公元1624年,清朝入关前的第一个甲子年)到「乾隆一百年」(公元1835年)。乾隆五十二年(公元1787年)又编了一部《万年历》,把年限延长至「乾隆二百年」(公元1935年)。乾隆以后,凡新皇帝即位都会重编《万年历》,把年限延长至新皇帝年号的第二百年。所以《万年历》在嘉庆四年(公元1799年)、道光四年(公元1824年)、咸丰元年(公元1851年)、同治元年(公元1862年)、光绪二年(公元1876年)都有续修。最后一部《万年历》在宣统二年(公元1910年)编成,年限延长至「宣统二百年」(公元2108年)。

《万年历》虽然预推二百年的日历,可是清政府每年颁行的历书《大清时宪书》不根据《万年历》,《大清时宪书》有时会修正《万年历》的预推。例如嘉庆《万年历》预推嘉庆四十六年(实际是道光二十一年)十一月大、十二月小,十二月初一的日干支是辛巳(公元1842年1月12日),而《大清道光二十一年时宪书》改为十一月小、十二月大,十二月初一的日干支是庚辰(公元1842年1月11日);道光《万年历》预推道光三十六年(实际是咸丰六年)十月小、十一月大,十一月初一的日干支是甲寅(公元1856年11月27日),而《大清咸丰六年时宪书》改为十月大、十一月小,十一月初一的日干支是乙卯(公元1856年11月28日);同治《万年历》预推同治二十九年(实际是光绪十六年)六月小、七月大,七月初一的日干支是戊辰(公元1890年8月15日),而《大清光绪十六年时宪书》改为六月大、七月小,七月初一的日干支是己巳(公元1890年8月16日)。这样的例子还有不少,说明《万年历》即使在清朝也不是正式采用。根据刘宝琳和Richard Stephenson的文章,[Liu-Stephenson98]《万年历》与《大清时宪书》的历日差异是因为《万年历》显然用了简略算法计算日历,当合朔时刻接近夜半零时,用简略算法算出的朔日或会落在错误的日期。

公元1912年中华民国成立,宣布改用公历,但是农历仍在民间流行。于是中国有两个新年,民间对公历新年反应冷淡,到了农历新年却非常热闹,当时有「民国的新年」和「国民的新年」说法。北洋政府颁行的《中华民国历书》除了登载公历外,仍然登载农历。到了1929年,南京国民政府试图禁止农历在民间使用,国民政府颁行的《国民历》不再登载农历。但是人民已习惯了使用农历,而且传统习俗和节日都依据农历,所以禁令难以实行。1934年,国民政府无奈表示「对于旧历年关,除公务机关,民间习俗不宜过于干涉」,停止了强制废除农历。

由于政府不再颁行「官方农历」,在民间流行的农历有时会出现不同版本。1953年,中国大陆出现了两种不同的日历,一种根据宣统《万年历》载农历六月小、七月大(七月初一在8月9日),另一种根据紫金山天文台的资料载农历六月大、七月小(七月初一在8月10日)。自此以后,内地出版的日历大都根据紫金山天文台的资料,而不再用《万年历》了。到了1978年在香港和广州等地出现了两种版本的农历。根据紫金山天文台编的农历该年的八月初一在公历9月3日(合朔时刻是00:09(UTC+8)),而香港和从香港运到广州等地的一些日历根据宣统《万年历》载八月初一在公历9月2日,导致两种版本的中秋节日期有一日差异。这朔日差异主要是由于宣统《万年历》计算的时间是根据北京的地方视时,推算的合朔时刻在9月3日零时之前数分钟。从此以后,香港和内地都采用紫金山天文台编的农历。在1989年又出现了宣统《万年历》与紫金山天文台对农历七月初一的日期差异,此时香港与内地一致采用紫金山天文台的资料,但在台湾却不然。经台湾权威机构证实紫金山天文台的数据正确后,台湾出版的大量错误日历遭收回。

《国标》的订立,就是为了杜绝这些不同版本的农历带来的混乱。《国标》文件列出的农历编算法则与顺治二年(1645年)历法改革所定的法则基本上一致,《国标》主要是用现代天文学严格定义历算中涉及的天文学概念,比较专门的概念不便在文件中详细说明,所以说要依照国际地球自转和参考系服务规范(IERS Conventions)发布的文件来诠释那些专门概念。文件也规定朔和二十四节气时刻计算精度应达到一秒(不计及编算时尚未正式公布的闰秒),1912年至《国标》生效之日期(2017年9月1日)间的农历日历应参考紫金山天文台编算的农历。中国科学院会提前一年正式发布农历日历的年度标准资料,所以农历又有了「官方版」。《国标》主要目的是以现代天文学概念规范农历的编算方法,订立国家标准,杜绝错误的农历经辗转复制发行而给社会带来混乱。

我认为订立编算农历国家标准是好事,但对其中的一秒计算精度要求感到困惑。编算历法根本不需要把朔和节气时间算到一秒,除非朔和节气时间离午夜零时小于一秒,但这样的情况绝少出现。要达到一秒精度要求,必须把太阳和月球的位置计算得很准确。太阳的平黄经在一回归年增加360°,所以在一秒钟的时间,太阳的视黄经平均来说增加360°/(365.2422×86400)=0.04"(即0.04弧秒)。所以要把二十四节气的时刻算准到一秒,必须把太阳的视黄经算准到0.04"。同理,要把合朔时刻算准到一秒,月球的视黄经必须计算准到360°/(29.5306×86400)=0.5"。世界上预先编算的太阳和月球位置历表,或许要到1970年代末才达到这样的精度。另外,必须严格定义「视黄经」来配合这个精度要求,所以《国标》明确规定必须按国际地球自转和参考系服务规范(IERS Conventions)定义的天球座标来计算太阳和月球的视黄经。

如前述,高精度的合朔和节气时刻只有在少数情况下,当这些时刻接近午夜零时时才有必要。但是这些情况要在数十年后才会出现,而且现在对这些情况暂时无能为力,原因是现在不能把数十年后的合朔和节气的UTC+8时刻很准确地算出。现代的准确历表大多以质心力学时(barycentric dynamical time)TDB为时间标准。TDB是用广义相对论来定义的均匀时间,用来计算月球和太阳系行星的位置。编算农历要用UTC+8时间,所以必须把TDB转化为UTC+8。这可先把TDB转化为地球时(terrestrial time)TT,然后再把TT转化为UTC+8。TDB与TT的转换可用广义相对论的变换公式计算,但是TDB与TT在数千年来的差异不大于二毫秒(即0.002秒),所以在编算历法时可省略这一步,即把TDB与TT视为等同。而TT与国际原子时TAI有简单的关系: TT=TAI+32.184秒,上面说过TAI和UTC相差整数秒,确实的秒差涉及到究竟有多少闰秒加到UTC上。所以要把TDB化为UTC+8,就要知道闰秒的数目,但是地球自转不均匀,数十年后的闰秒数目难以准确预测。所以虽然现代的高精度历表能把数十年后的合朔和节气的TDB时刻计算得很准,但是其对应的UTC+8时刻还是不能准确算出。因此我们对数十年后接近午夜零时的合朔和二十四节气日期暂时无能为力。面对这些少数的合朔和节气,我认为最佳的处理方法是承认现在无法断定这些合朔和节气的日期,确实日期与现在推算的日期或会有一日之差。本网站就是用这样的方法处理这些少数的合朔和节气。

合朔和节气时刻接近午夜零时的情况以前当然也曾发生,以前对合朔和节气的定义没有现在那么精确,计算方法也没有现在那么准,而且在1929年以前的时刻也不用东经120°的标准时。所以用现在的方法计算以前的合朔和节气日期有时与当时的计算结果不一致,而算出的农历也可能与以前通行的日历不一致。遇到这些情况时,应以当时政府颁行的日历为准。本网站所列的月相和节气时刻都是根据现代方法计算,但是历代的农历日期依照当时政府颁行的历法。至于二十四节气的日期,年历网页中在公元1733年以前列出以当时历法计算的日期,称为「历书节气」,1733年以后的历书节气根本上与现代计算的一致,所以略去不注,只有遇到与当时的历书有不一致时才会用红色字形注明。



备 注 和 参 考 文 献