我们程序设计基础课出乎我所料得出现了许多具有“算法”难度的练习题,助教给了一些附加题,让我找回了高中竞赛的钻研算法感觉,挺过瘾的。但是第一题就让我觉得很郁闷,这是一道关于“儒略日”计算的问题,高中时我做过求星期几的题,也不过是用公历来倒推,一直觉得就是这样罢了,可是我做这道题的时候怎么也不和天文学的计算结果相同。我觉得这里面有问题,上网查了一下历法,忽然想起原来阅读天文学科普书的一些东西,这里面问题可大着呢!

原题(这题目本身没什么问题):儒略日(Julian day)是指由公元前4713年1月1日,协调世界时中午12时开始所经过的天数,多为天文学家采用,用以作为天文学的单一历法,把不同历法的年表统一起来。它是一种不用年月的长期纪日法,简写为JD。是由法国学者Joseph Justus Scaliger(1540–1609)在1583年所创,这名称是为了纪念他的父亲——意大利学者Julius Caesar Scaliger(1484–1558)。

儒略日的起点订在公元前4713年1月1日格林尼治时间平午(世界时12:00),即JD 0 指定为 4713 B.C. 1月1日12:00 UT到4713 B.C. 1月2日12:00 UT的24小时。每一天赋予了一个唯一的数字,顺数而下,如:1996年1月1日12:00:00的儒略日是2450084。这个日期是考虑了太阳、月亮的运行周期,以及当时收税的间隔而订出来的。

以儒略日计日是为方便计算年代相隔久远或不同历法的两事件所间隔的日数。由于儒略日数字位数太多,国际天文学联合会于1973年采用简化儒略日(MJD),其定义为 MJD = JD–2400000.5。MJD相应的起点是1858年11月17日世界时0时。

首先,咱要和辅导员、助教探讨这件事。所以发生了以下的讨论:

Myheimu 2007-10-22 17时左右

我查了一下,儒略日是从“儒略历”的前4713年1月1日中午12时开始算的(儒略历是公元前46年开始使用),而现行的格里历(公历)是从1582年才开始使用的。首先,两者历法有别,格里历(公历)是四年一闰,百年不闰,四百年又闰;儒略历长期是四年一闰,而且在公元左右的数百年期间还曾三年一闰,所以两者设置闰年方面很不相同。其次,在儒略历1582年10月4日的第二天被定为格里历10月15日,中间去除了10天。第三,目前史学界大多对1582 年后使用格里历计算,而之前,乃至比公元前46年更早的时候,都是用儒略历或者它的倒推,一般不用格里历倒推。有说法是儒略历公元前4713年1月1日相当于公历该年的11月24日,但是对于1582年之前乃至公元前的年份谈论闰年问题是非常麻烦的,即使是对于公历历法,我也搞不清公元前1年算闰年还是平年(事实上公历历法只管1582年之后)。所以附加题的第一题不是一个适合编程的题目,不仅对初始时间的表达有问题,而且并没有局限时间范围。我觉得可以改成要求用1858年11月17