Linux cal命令在9999年之前是否正确?

时间:2015-02-05 10:09:17

标签: linux calendar

cal命令显然会检查这样的闰年:

if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) then leapyear=true

我的问题是,从现在起到9999年(此命令的有效年限)是否还有其他闰年,此定义未涵盖。如果是,这些也被cal命令覆盖了吗?

3 个答案:

答案 0 :(得分:1)

如果你的文明遵循公历(否则你可能不会使用Linux),这就是闰年的确切定义。这个有点奇怪的定义被使用是因为一个天年(地球围绕太阳转一圈)需要略多于365,但不到366天。它的计算方式是365 + 1/4 - 1/100 + 1/400 = 365.24925天。

答案 1 :(得分:1)

不是公历的规则,所以cal是该日历的正确实现。

但是,在9999年之前,公历是否会被使用,这是任何人的猜测。我的猜测是它不会幸存,因为它的不精确性在几千年后变成了一个显着的因素。

此时的热带(自然)年大约为365.2422 * 天(随着时间的推移,随着地球的自转速度变慢,但是慢慢变得越来越慢)。公历的4 - 但不是100除400之外意味着公历年平均为365.2425天。这不是一个糟糕的近似值,但这意味着在地球历史的这一点上,大约每3236年 + 年就会失去一天。

当人们确定这是一个问题并插入另一个闰日(或完全改变规则)时,cal的实现者无法预测,因此他们遵守公历的规则。

* 平均而言。由于来自其他行星的引力,它略有不同。

+ 我看了一下。当然,这个数字也存在一些差异。

答案 2 :(得分:1)

来自https://www.timeanddate.com/date/leapyear.html

  

在公历中,必须考虑3个标准   确定闰年:

     
      
  • 年份可以被4整除;
  •   
  • 如果年份可以平均除以100,则不是闰年,除非;
  •   
  • 这一年也可以被400整除。然后是闰年。这意味着2000和2400是闰年,而1800,1900,2100,2200,2300和2500是   不要闰年。
  •   

查看用于cal的Debian源代码: http://anonscm.debian.org/cgit/bsdmainutils/bsdmainutils.git/tree/usr.bin/ncal/calendar.c#n205

看起来他们在那里做的正确。