什么是儒略日?它和公历如何转换?

什么是儒略日?它和公历如何转换?

原文在我的博客上,链接:对儒略日计算公式的解读_Spark036_新浪博客

儒略日是法国学者Joseph Justus Scaliger(1540-1609)设计的一种历法,与尤里乌斯·恺撒于公元前45年颁布的儒略历没有关系,不要混淆。儒略日是指从公元-4712年1月1日12时(公元前4713年1月1日12时)开始连续计算得出的天数(不满一日的部分用小数表示)。

设Y为给定年份,M为月份,D为该月日期(可以带小数)。

(1)若M > 2,Y和M不变;若 M =1或2,以Y–1代Y,以M+12代M,换句话说,如果日期在1月或2月,则被看作是在前一年的13月或14月。

(2)对格里高利历有:A = INT(Y/100), B = 2 - A + INT(A/4);

对儒略历,取 B = 0

(3)要求的儒略日即为:JD = INT( 365.25*(Y+4716) ) + INT( 30.6001*(M+1) ) + D + B - 1524.5

注意:(1)公式中的INT( )是取整的意思,由于不同的计算机语言对负数取整所采用的操作不同,所以本公式使用了一些技巧,避免出现负数,INT( )只对正数取整;(2)本公式适用于计算-4712年1月1日12时以后的任何日期的儒略日,不使用于此之前的日期。

1、首先看第一部分:INT( 365.25*(Y+4716) )

这部分明显是用来计算年份对应的日数的。

(1)这里的第一个疑问是:为什么年份要加4716,而不是4712,计算儒略日的起始时间明明是-4712年1月1日12时啊?

答:根据公式的第一条,计算-4712年1月份和2月份的儒略日时,年份会变成-4713,如果加4712,会出现负数,对负数取整有歧义,不利于编程实现,应避免公式计算过程中出现负数,因此,不能加4712。(至于为什么会有第一条规则,后面会详细解释)

(2)这时会出现第二个疑问:那直接加4713不就行了,就不会出现负数了,为什么要加4716?

答:这里加的数必须是四的倍数。为什么呢?我们注意到,前面的被乘数是365.25,该数乘以1、2、3时,取整时,小数部分都会被舍掉;当乘以4时,0.25就会积累到一个整数,取整时就不会被舍掉。也就是每四年会多一天,即四年一闰。因此,年份的加数必须是四的倍数,这样,就不会影响年份的平闰。例如-4709年是平年,乘积中的小数部分应该被舍掉,但是如果加数是4713,0.25*4变成整数了,就不会被舍掉,相当于天数多了一天。这样就给公式的设计上带来了很大的麻烦。因此加数必须是4的倍数,而且要大于4712,那么里的最近的整数就是4716了,当然4720也行,只需要在后面多减365.25*4 = 1461天就行。

这样,这部分就解释清楚了。由于这里多算了四年的天数,所以公式最后要减去365.25*4 = 1461天。又由于儒略日是从中午12点开始计算的,所以还需要减去0.5天。这样总共减了1461.5天,与公式后的1524.5天还差63天。至于这63天来自何处,后面会详细解释。

2、B也是跟年份有关的天数,所以这一节先解释一下B的含义。

其实,B是为了调整格里高利历和儒略历的差别而引入的。

(1)如果计算的日期在儒略历的范围内,即公元1582年10月5日之前,那么B=0。

因为儒略历规定四年一闰,所以使用INT( 365.25*(Y+4716) )计算出的年份对应的日数是正确的,不需要调整。

(2)如果计算的日期在格里高利历的范围内,即公元1582年10月4日之后,那么就需要计算B了。

因为格里高利历规定四年一闰,但是遇世纪年(整百年份)时,必须被400整除才是闰年。使用INT( 365.25*(Y+4716) )计算出的天数没有考虑这一点,所以需要在此基础上,减去世纪年的个数(A),再加上世纪年中,能被400整除的个数( INT(A/4) )。

(3)那么B中加的2又是怎么回事呢?

这是因为,对于1582年,使用我们上面的算法:-A + INT(A/4),得出需要减12天。但是格里高利历其实只抹掉了10天(1582年10月4日下一日直接跳到10月15日),相当于我们的方法多减了2天,所以要把这2天再加上。

这样,B也解释清楚了。

3、 INT( 30.6001*(M+1) )

这一部分是计算月份对应的天数的。那么30.6是怎么得到的?M为什么要加1?M=1和2时,为什么要将M变为M+12,同时将Y设为Y-1?最后减的那63天又是哪里来的?

其实这几个疑问是相互关联的,这一块我想了好久都没想明白,直到看到一个论坛的讨论后,才豁然开朗。下面是解释。

一些聪明的人发现了下面的事实:

即先把 1月及2月调到上一年 12个月后面,作 13 及 14 月计算,然后把月数加2再乘30.6,取整数后减63,便得原月份完结时的总日数。这就解释了30.6、63这些数字的来历,以及为什么M=1和2时,要做那些改变。

在计算儒略日时,由于M月还没有完结,所以用M+1计算上一个月完结时的总日数,本月所过的天数就是D了。

好了,到这里就将儒略日计算公式中各部分的含义都解释清楚了。不得不佩服设计者的心思,尤其是最后月份的计算,真是犀利,太佩服了。

在寻找答案的过程中,发现很多文章都是只知其然不知其所以然,然而最后在一些论坛中看到有很多人像我一样喜欢刨根问底,让我感觉自己也不算是另类。我的答案主要参考了术数纵横论坛中kskfk的回答,以及牧夫论坛中”浪淘沙“的回答,在这里贴出链接。

http://www.fengshui-chinese.com/discuz/viewthread.php?tid=36164

http://www.astronomy.com.cn/bbs/thread-167314-1-1.html