为什么从公元1年到2001年1月1日的日历天总数与热带天数相差3倍?

时间:2019-11-04 17:11:41

标签: calendar date-conversion

作为一点背景: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年不会犯那么大的错误。

这可能是一个历史性的问题,而不是我猜到的编程问题。

1 个答案:

答案 0 :(得分:2)

公历改革的目标是将北半球春分的日期重新设置为3月21日,并将其保留在那里。选择该日期的原因是,这是公元325年尼西亚议会时的春分的大约平均日期。在议会之时,春分的日期已从公元1月的3月25日开始缩短。 >

有关所有详细信息,请阅读Gregorian Reform of the Calendar这本书,这是梵蒂冈天文台在1983年举行的一次会议的记录。

为了明确起见,在比较公历与儒略历时,使用儒略历和公历混合使用了一次10天校正,旨在校正从公元325年到公元1582年的累积超leap年。 。如果要使用公元325以外的其他开始日期,则整个计算应仅使用公历或儒略日期。

相关问题