关于时间--地球公转与闰年

地球自转周期并不是完美不变的,而是在变慢,为了让UTC时间与地球自转始终吻合,闰秒被采用,详见我的博文关于时间–地球自转与闰秒

这篇文章我们来谈谈地球公转和闰年的问题。

地球绕太阳公转也并不是完美的原型轨道,而且公转周期也不是自转周期(天)的整数倍,而是365.2422天。在目前的历法中,一年有365天,这样日历上每1年就会比地球公转快0.2422天,4年下来就会快上0.9688天。以此推算,40年以后,日历就会快上96.88天,这就意味着北京的6月还是天寒地冻,显然与人们心目中的“6月”相去甚远。

为此,我们可以这样修正,即每4个365天后增加1天,即重复这个序列:365,365,365,366。然而这也会带来问题,就是本来日历比地球公转快0.9688天,现在却推迟了1天,这就导致4个历法年后比地球公转慢了0.0322天。以此推算,400年后就会慢0.0322*100=3.22天。这样就需要在400年中,寻找合适的机会减去这3.22天,于是规定了在准瑞年(0,100,200,300,400,…)中无法被400整除的(100,200,300)时减去一天。这样就会导致400年内历法只会慢0.22天,4000年也只会慢上2天,这个差异在可以预见的将来是可以忽略的了。

上述推演的过程就是目前的历法正在使用的算法。总结一下:

最基本的想法是,每4年增加一天,也就是出现一个准闰年;(能被4整除)
为了防止增加的过多,每400年内需要去掉三个准闰年;(能被100整除但是不能被400整除)

下面是判断给定年份是否是闰年的C语言算法。

int is_leap_year(int year)
{
    if(year % 4==0){
        if(year % 100==0 && year % 400 !=0){
            return 0;
        }
        return 1;
    }
    return 0;
}

在历法中,由于1、3、5、7、8、10、12是31天,4、6、9、11是20天,2月是28天。这样很自然地就把需要增加的这一天放到了最段的2月分了,闰年时,增加的那一天定为2月29日。如果你的生日是2月29日,你就很幸运了,每4年才能过一次生日!而且不能被400整除的整百年份还要被去除(如2100,2200,2300,2500…)。

我们知道地球自转速度在慢慢减小,地球公转速速呢?要是也发生较大变化,目前的历法也许还要面临修改。


版权声明:本文为smstong原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。