toolfree

农历国历转换

国历与农历互转,涵盖 1900 到 2100 年,同时显示干支、生肖与当日节气。历表由天文算法在编译时产生,并与公布的日期逐一核对过。

在你的浏览器中运行

农历
干支年
生肖
星期
节气
下一个节气

所有日期以东八区的日界为准,农历本来就是这样定义的。

农历是天文,不是公式

农历没有公式。任何一个转换器骨子里都是一张表,而那张表是把两个天文问题反复问出来的答案:

  1. 朔在什么时候? 含有朔(日月合朔那一刻)的那一个历日,就是初一。不是隔天,也不是初见 新月的那天,而是合朔那一瞬间所在的日子。
  2. 太阳黄经什么时候通过 30 度的倍数? 那十二个时刻就是中气,它们是把农历的月份绑在季节上 的东西。

两者都以东八区计算,因为农历本来就是这样定义的。这不是细节:一个发生在北京时间 00:14 的 朔,和同一个朔记成前一天 16:14 UTC,会让整个月提前一天开始。

三条规则

大多数说明都讲错的那一条

到处都看得到「没有中气的月份就是闰月」。这不是规则,而且是错的。

1985 年正月为例,它从 2 月 20 日到 3 月 20 日,里面一个中气都没有:雨水落在 2 月 19 日, 是它开始的前一天;春分落在 3 月 21 日,是它结束的后一天。照那条「规则」它该是闰月。但它不是—— 1985 年根本没有闰月。

问题出在规则的适用范围。月数是以「岁」为单位数的,从冬至到冬至,而那一岁只有十二个月。 1984 年的冬月刚好含了两个中气——12 月 22 日的冬至与 1985 年 1 月 20 日的大寒,相隔二十九天, 塞在同一个三十天的月份里——正月才会分不到。既然只有十二个月,就没有东西要插进去,也就不置闰。

一月初地球过近日点,走得最快,中气之间会挤到约二十九天半,一个三十天的月份便有可能吞下两个。 这种年份就是这样来的。

闰月的分布极不平均

这张表涵盖的 201 年里共有 74 个闰月,而它们的分布严重偏斜:

闰月1900–2100 出现次数
闰四月14
闰五月14
闰六月12
闰三月、闰二月、闰七月各 8
闰八月7
闰九月1——只有 2014 年
闰十月1——只有 1984 年
闰十一月1——只有 2033 年
闰正月、闰十二月从未出现

原因在地球轨道。七月初过远日点,太阳走得最慢,相邻两个中气可以拉开到约 31.4 天,一个 29 或 30 天的月份很容易刚好卡在两者之间,一个都碰不到。一月初过近日点则相反——中气挤到约 29.4 天, 一个月要完全不含中气几乎不可能。

所以 2033 年的闰十一月不是趣闻,而是农历最罕见的一种情形,也正是当年好几本历书算错的原因。

为什么只做到 1900 与 2100

再往外算不是做不到,是不敢保证。关键在 ΔT——地球自转与均匀时之间的差。2005 年以前是量出来的, 之后是外推的,到 2100 年的外推误差大约是一分钟。

一分钟只对「本来就落在午夜前后一分钟」的时刻有影响,而这两百年里有十六个。最极端的是 2057 年 9 月 28 日的一个朔,落在北京午夜前两秒。市面上的历书对那个月本来就有分歧,将来也还会 有;没有谁算错,只是问题比数据本身更精细。

其他几个也值得记一笔,性质完全一样:1979 年的大寒与 1923 年的雨水都在午夜前后三秒内, 2021 年的冬至则落在 23:59:19。

这张表是怎么来的

它在编译时产生,用的是 Meeus《Astronomical Algorithms》第 49 章的月相与第 25 章配合 VSOP87 的太阳位置,换算成东八区的历日之后,再套上面那三条规则。

产生器在对不上公布日期时拒绝输出任何东西:29 个从 1900 到 2100 的春节日期、31 个闰月 (包括 2033 年)、11 个确定无闰月的年份,以及 12 个节气。这些锚点在测试里再验证一次,所以重新 产生历表不可能悄悄改掉答案。

之后全部在你的浏览器里执行,历表本身大约 11 kB。

页面上的其他栏位

干支是六十甲子:十天干配十二地支,六十年一轮,不是十二年。2024 年是甲辰,1964 年也是, 2084 年还是。

节气显示这个日期落在哪一个节气里,以及下一个节气还有几天。想看整年的话, 二十四节气表列出全部二十四个。

生肖从春节换,不是从元旦换——这是最多人算错的一件事,另有专页说明