• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 位置: php 中文手册 -> php 绑定的扩展库

    php 日历函数

    儒略日的用途及其转换

    我们现在所使用的以西元年、月、日表示的格里历(Gregorian calendar ),就像是把日期折叠起来表示的历法。对我们平常的认知来说,这是很自然的,但因它不像十进位数那么规律和单纯,在做一些计算时很不方便,尤其在作不同历法之间的转换时更是麻烦。

    法国学者 JosephJustus Scaliger (1540-1609 )设计了一种历法,称为”儒略日”(Julian day)。以JD 表示。它是以7980 年为一周期,我们所在的这一周期是以西元前4713 年(或-4712 年)1 月1 日12 时为起点,在这周期内,每一个数就对应唯一的一个日,就像是把一般的日历拉成一直线,完全以天数来计日,如此在计算上十分方便,

    例如,我们若要知道2000 年1 月1 日为星期几,则可先求出这一日的儒略日为2451545 (此即自西元前4713 年1 月1 日12 时起至2000 年1 月1 日12 时止之日数)。若西元前4713 年1 月1 日为星期一,则求出(2451545+1 )除以7 的余数为6 ,即为星期六。当余数为0 时代表星期天。

    同样的,在求算中国的日天干与日地支时亦是如此,若西元前4713 年1 月1 日的天干为”癸”,这是天干中的第十个,若以第一个对应0 ,第二个对应1 ,第三个对应2 ,依此类推至第十个应对应9 ,所以求出(2451545+9 )除以10 的余数为4 ,即”戊”之对应。

    若西元前4713 年1 月1 日的地支为”丒”,这是地支中的第二个,若以第一个对应0 ,第二个对应1 ,第三个对应2 ,依此类推至第十二个应对应11 ,所以求出(2451545+1 )除以12 的余数为6 ,即”午”之对应。

    要将格里历日期转换为儒略日,可有许多不同的方法或公式。底下即为一种方法。若以y 代表年份,m 代表月份,d 代表月中日期,ut 代表时(若含分、秒,可先化为小数的时,再加上整数的时)。int()为程式中常用的取整数函数(在javascript 中以Math.floor()替代)。mod 为取余数之函数(在javascript 中以%替代),x mod y 就表示取x 除以y 的余数。计算原则是以3 月为一年之首月,2 月为一年之末月,使2 月29 日成为四年的最后一日。如果我们以3 月为一年中的第一个月,2 月为前一年的末月,则经变数变换:

    将3~12 月对应到0~9 月,将1~2 月对应到10~11 月

    下式为将格里历转换为儒略日的公式,适用于1582 年10 月15 日及以后:

    格里历是在西元1582 年10 月15 日开始使用的,在这之前使用的是儒略历(与儒略日不同,不要混淆了),这是在西元前46 年,由罗马帝国的恺撒大帝所制订。它只设定每隔四年的2 月为闰月,所以平年为365 日,闰年为366 日。平均每年为365.25 日。但平均回归年为365.24219 日,与365.25 日差了约0.00781 日,1500 年后就差了11.7 日。1582 年,罗马教皇格里高利十三世对儒略历进行修改,在原有的基础上规定百年不闰,四百年又闰。称为格里历,自1582 年10 月4 日的次日开始使用。但为了减少先前儒略历所造成的日数误差,10 月4 日的次日直接跳到15 日。

    下式为将儒略历转换为儒略日的公式,适用于西元元年至1582 年10 月4 日及以前:

    转换的方法并非唯一,读者亦可试着自行设计一个转换副程式或函式。

    反过来,儒略日转换为格里历或儒略历,也是以1582 年的10 月15 日0 时为分界点。在这之前为儒略历,之后为格里历。通常与它的JD 值2299160.5 日比较。