【发布时间】:2019-11-04 17:11:41
【问题描述】:
作为一点背景知识:1582 年 10 月,Gregorian calendar 被引入以纠正当时使用的儒略历的问题。公历更精确地指定了一年的长度,添加了新的闰年计算,并在转换时从儒略历中删除了 10 天(从 1582 年 10 月 4 日移动到 1582 年 10 月 15 日)
// Julian leap year calculation
((year % 4) == 0)
// Gregorian leap year calculation
((year % 4) == 0 && (year % 100) != 0) || (year % 400) == 0)
总结从公元 1 年到公元 2001 年的所有日历日,我使用:
#include <stdio.h>
int main( void)
{
int year;
int daysInYear;
int total;
total = 0;
for( year = 1; year <= 2001; year++)
{
//
daysInYear = 365;
if( year < 1582)
daysInYear += ((year % 4) == 0);
else
if( year > 1582)
daysInYear += ((year % 4) == 0 && (year % 100) != 0) || ((year % 400) == 0);
else
daysInYear -= 10; // 1582 exactly
total += daysInYear;
printf( "%d: +%d = %d\n", year, daysInYear, total);
}
return( 0);
}
现在从 1 年到 2000 年的所有年份都详尽地运行它会得到这个 pastebin:https://pastebin.com/bR7hwNr1
最有趣的部分表明闰年和跳日计算是正确的,并且也产生了结果:
1: +365 = 365
2: +365 = 730
3: +365 = 1095
4: +366 = 1461
...
100: +366 = 36525
...
400: +366 = 146100
...
1581: +365 = 577460
1582: +355 = 577815
1583: +365 = 578180
...
1900: +365 = 693962
...
1996: +366 = 729026
1997: +365 = 729391
1998: +365 = 729756
1999: +365 = 730121
2000: +366 = 730487
现在的问题是:1.1.2001 是经过 730487 个日历日。鉴于公历定义的一年长度为 365.2425,我预计会看到 2000*365.2425 = 730485 天。如果使用tropical days 或太阳日,它将是 730484。但 740487 显然超出了范围。
假设没有人算错公历范围内的任何日子,儒略历中有一些额外的日子与热带日子不匹配。但是公历是为了更正儒略历而创建的,我认为他们不会在 1582 年犯那么大的错误。
这可能是一个历史问题,而不是我猜的编程问题。
【问题讨论】: