青菜年糕汤

一箪一瓢,一期一会。以文会友,以友辅仁。

2020年1月22日

为地球人设计历法:公历、农历、闰年

作者:青菜年糕汤

年糕星人朋友们,今天我们来推理一下地球人是怎么设定历法的。

太阳和月亮的在天空中的变化,是地球上最普遍的周期性现象。它们也是对人类的生产(尤其是农业)生活影响最大的周期性现象。所以世界各地的祖先们都以此定下历法。

地球上的这么多文明有这么多不同的历法,“巧”的是对一天的长度定义大多是一样的——从太阳在天空中的一个位置到它再次到这个位置到时间就是一天。

如果仔细地看,由于地球运动不均匀,这样定义的一天(视太阳日)的长度在一年里是不断变化的。

为了方便,人们把它平均了一下,就变成了我们熟悉的24小时的平太阳日。

这个平太阳日与国际单位制的86400秒还是不完全一样,因而有了麻烦的闰秒,不在这里讨论。

定义了日,我们发现月亮绕地球公转的周期,也就是月相的变化周期,大概是29.53天。

如果我们设定有的月30天,有的月29天,大月小月交替,应该能凑到平均每个月29.53天。

接下来我们发现,地球绕太阳的公转的周期大概是365.24219天,这个周期可以叫做年。

这样问题就来了,一年会有365.24219 / 29.53 ≈ 12.37个月。非常别扭。

可不可以每年弄13个月,其中一个月就11天呢?

不行。这样“月”这个单位就失去了意义,它一来不能代表大致相等的一段时间,不能用作计量单位;二来不能符合月亮运动的周期,不能与月相变化对应。

那就只能让每年一般只有12个月,再大概每三年(其实是“十九年七闰”)多出一整个月来,作为闰月。

这样的历法其实就是农历的大致思路了。即将到来的庚子鼠年就是一个闰年,会有两个四月。

农历有时候被称为阴历,但它其实不但符合月亮的周期,而且符合太阳的周期,所以应该被称为阴阳历。

这么优秀的历法,现在为什么不怎么用了呢?

我觉得农历最大的缺点就是,它的算法很复杂。你可能会注意到,我根本没提什么时候是大月,什么时候是小月,闰月在什么时候,闰月又有几天,规则太细碎了。

古人很早就能制定出严格的算法,准确设计出几千年的日历,让它同时符合太阳和月亮的周期。但普通人很可能没有能力推算出日历,或者很容易算错导致混乱,所以会有官方统一颁布的“老黄历”。

另一个缺点是,农历虽然从总体上符合太阳的周期,但还是会在三年内有一个月左右的跳动。很多季节的感知,尤其是对农业有重要作用的二十四节气,是以年为周期的一个循环。用农历这种或长或短的“年”来衡量就会毫无规律。

当然,“老黄历”里面也包括了节气,从这个侧面也能反映出这套系统有多复杂。

我们真的这么需要让日历跟月亮、跟潮汐相符吗?为此引进这么大的复杂度真的有必要吗?也许我们智慧的老祖宗们觉得有必要,或者觉得挺简单的,但我总感觉有点过度工程化 (overengineering)了。

让我们再回到“一年会有365.24219 / 29.53 ≈ 12.37个月”这个问题上。

还有种做法是平均分配到12个月上,这样每个月会有365.24219 / 12 ≈ 30.44天。可以让有的月30天,有的月31天。

这样一个月不符合月相变化的周期,不能指导人们看月亮看潮汐了。但月的长度还是大概固定的,还是能作为一个计量单位。

公历就是这样。

因为太简单,不妨讨论得更深入一些,来看看公历的闰年是怎么设计出来的。

前面说了,地球绕太阳的公转周期(回归年)大约是365.24219天。

如果一年是365天,每年少0.24219天。每四年安排一天闰日,平均每年加上0.25天,这样每年比回归年多0.25 - 0.24219 = 0.00781天。

这样每 1 / 0.00781 ≈ 128年就会多一天。所以每一百年再少一个闰日,平均每年就是少0.01天。算下来每年比回归年少了0.01 - 0.00781 = 0.00219 天。

这样每 1 / 0.00219 ≈ 457年就会少一天。所以让每四百年再多一个闰日,平均每年就是多0.0025天。算下来每年比回归年多了0.0025 - 0.00219 = 0.00031天。

误差越来越小了。

但这样每1 / 0.00031 ≈ 3225年还是会多一天。要不要每四千年再少一个闰日呢?那还是等快到公园4000年的时候再讨论吧,暂时先不管了。

这就是公历全部的规则了。即使手上没有日历,你也大概不会忘记这个月有几天、今年有几个月、今年有几天。这岂不方便?

读到这里,不知你有没有发现:农历庚子鼠年是闰年,公历2020年也是闰年。

双闰年快乐!