作为一点背景:1582年10月,引入Gregorian calendar来纠正朱利安历法的问题,该历法一直沿用至今。公历更精确地指定了一年的长度,添加了新的leap年计算,并在过渡期间从儒略历中删除了10天(从1582年8月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 AD到2001 AD的所有日历天,我使用:
#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
最有趣的一点表明the年和跳过日期的计算是正确的,并且还会产生结果:
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年不会犯那么大的错误。
这可能是一个历史性的问题,而不是我猜到的编程问题。
答案 0 :(得分:2)
公历改革的目标是将北半球春分的日期重新设置为3月21日,并将其保留在那里。选择该日期的原因是,这是公元325年尼西亚议会时的春分的大约平均日期。在议会之时,春分的日期已从公元1月的3月25日开始缩短。 >
有关所有详细信息,请阅读Gregorian Reform of the Calendar这本书,这是梵蒂冈天文台在1983年举行的一次会议的记录。
为了明确起见,在比较公历与儒略历时,使用儒略历和公历混合使用了一次10天校正,旨在校正从公元325年到公元1582年的累积超leap年。 。如果要使用公元325以外的其他开始日期,则整个计算应仅使用公历或儒略日期。