cal命令显然会检查这样的闰年:
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) then leapyear=true
我的问题是,从现在起到9999年(此命令的有效年限)是否还有其他闰年,此定义未涵盖。如果是,这些也被cal命令覆盖了吗?
答案 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
看起来他们在那里做的正确。