关于“儒略日”计算的问题

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

原题(这题目本身没什么问题):儒略日(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日世界时0时的MJD起点来推导,时间局限于1582年10月15日之后。我做的题目是时间局限于1582年10月15日之后的。如有错误,请麻烦指教 ^_^

不过,辅导员给咱提了反对意见……真抱歉,麻烦他在深夜12时都来回复,好辛苦的!

施导 2007-10-23 00:22:19

我被你也弄晕了,事实上,我这么说吧,儒略日是今天目前为止我们的天文学家天天都在用的一个东西,去看我们的科技文献,比如算彗星轨道什么的,用的都是儒略日。儒略日的作用就好像计算机里面用一个连续的数字表示时间,这样可以轻松计算得到两个日期之间相差的时间。儒略日与公历的换算方法在很多当代的天文入门书籍里面都有(比如科学技术出版社的《天文爱好者手册》),很简单,算法是这样的:认为我们的公历是无限的,在0附近是 -1, 1, 2, 3 … ,这样的序列里面,当年份为正数的时候,(Y % 4 == 0) && ((Y % 100 != 0) || (Y % 400 == 0)) 是闰年的条件。对于负的情况,由于没有 0 年,所以,要做一个替换,就是 Y = -(Y + 1),这道题的目的就是考察大家用一个 IF 语句和一个复杂的布尔表达式

施导 00:23:57

另外有一个我觉得和你不一样的想法是:公历 100 年的时候,我们尽管没有使用公历,不过这并不代表公历 100 年没有意义。在天文学上,很多时候,要表示原始社会的时候发生了某个天文现象,我们用公元前 10000 年这个用法,并不能因为那时候没有公历,而不使用啊。

施导 00:25:43

另外,解释一点是(这是我原来在《中国大百科全书 . 天文卷》上看到的),儒略历和现代天文学上用的儒略日没有任何关系。尽管名字上有渊源,然而实际上,现代儒略日的计算方法是基于公历的,因此可以直接与公历进行换算。

myheimu 2007-10-23 15:25:17

公历100年时候存在儒略历呀,而且是西方历法的主流,公历是作为儒略历的一个修补而出现的,我查到的资料就是说一般对于儒略历之前就是用儒略历来倒推,而一般不会用相差1600年的公历来倒推的

现代的儒略日的计算方法当然是基于公历的,因为现在多使用公历,计算儒略日很多时候是对于现在来处理,所以主要需要基于公历的计算方法。但是不管是如何的计算方法,儒略日的确是从儒略历的公元前4713年开始计算的,至于它和公历的关系,是数学家和天文学家通过演算得出的,只是适合现在使用的计算工具而已。

myheimu 15:39:51

“儒略日不适宜先秦史断代” 有一段:

因此,儒略日纪日体系于1582年前是以《儒略历》为依据的,它的记日数值实际上是若干《儒略历》历年长度的合计。

张培瑜在《三千五百年历日天象》一书中写道:“目前世界上通用的公历纪日方法是,凡公元1582年10月以后一律用格历,以前的历日化为儒历(4年1闰,公元年数能被4除尽者置闰),各国出版的各种历书、历表都统一采用这种纪日方法,以便于比对,并与儒略日这种连续纪日法也对应了下来。本书公历就是采用这种方法注记的。”

国际惯例是格里历之前的历日,习惯上一律按照儒略日推算。

myheimu 16:03:24

特别的,在维基中国的“儒略曆”里还专门提供了“公曆日期與儒略曆日期的差距”,而这个差距是以1582年开始提供的。也就是说,公历就是从1582年开始使用,而之前有了广泛使用的儒略历,也有了对于更早时间的儒略历倒推,所以一般不使用公历来倒推。这也是为什么您看到的大多数资料只说:“儒略日(Julian day)是指由公元前4713年1月1日,協調世界時中午12時開始所經過的天數”,因为对于公元1582年之前通常使用儒略历,一般也就默认了公元1582年10月15日之前的“公元××年”“公元前××年”就是指儒略历。如果非得要用公历来倒推的话,反而一定要强调是“公历公元××年”,这样以来对于公历“倒推”的“公元”就失去了关于耶稣的某种意义,我想,这或许是外国人不愿意用公历倒推的另外一个宗教原因吧。

myheimu 16:05:20

正如您所说的,同样,维基中国上也说“儒略曆(Julian Date)是把經過的儒略日與一指定小數相加所得出的結果,与儒略日是完全不同的概念。”,但我有点奇怪一个历法(儒略历)为啥是一个“儒略日與一指定小數相加所得出的結果”,感觉怪。

myheimu 16:23:56

总结一下:

首先。国际惯例是对于公历1582年10月15日之前乃至更早都使用儒略历来计算和倒推,对于公历1582年10月15日之前一般地说“公元××年”就应当指儒略历,(另外对于英国及其殖民地,包括现在的美国却又在1752年才改换公历,所以Unix 系统的cal生成的1752年9月2日之后一天是9月14日);

第二。儒略历历法比公历要复杂,变革很多,想简单地用几个语句来计算是不可能的。类似unix系统等也只能用各种方式来弥补。

第三。公历100年的说法一般不使用,除非极个别的情况,同第一条的道理,所说的公元100年是指儒略历,而当时的历法是四年一闰,所以这一年是闰年。(对于这一点的讨论,在http://ks.cn.yahoo.com/question/1406030901877.html,不过我觉得里面的回答的人没有一个答出原因的,呵呵)

第四。就题论题,这道题首先不可能要求学生从(儒略历)公元前4713年1月1日开始算,其次也不应该把同学引到一个并不存在也基本不被使用的公历公元前4713年11月24日。唯一的科学办法就是要求从1858年11月17日来推算公元1582年10月15日之后的时间,这样才能使用我们所熟悉的公历历法。

现在这事还得再讨论……

周五那天上机实验课,我当面和施导说了这件事,最后施导也同意我的说法,把这道题取消了。他说最初他是希望考察同学关于没有“公元0年”的问题。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据