儒略日( Julian day,JD)在天文学上应用广泛,它是一种计日为主的历法,起始时间为公元前4713年1月1日,协调世界时中午12时。儒略日由法国学者Joseph Justus Scliger(1540~1609)在1583年所创,这名称是为了纪念他的父亲——意大利学者Julius Caesar Scaliger(1484年-1558年)。
现在的儒略日是2454719.14861,表示2008年9月9日15:34:00。后面的小数表示的就是时分秒的信息。
其中0.1表示2.4小时、144分钟或者8640秒,以此类推。
由于儒略日数字位数太多,国际天文学联合会于1973年采用简化儒略日(MJD),其定义为 MJD = JD – 2400000.5。MJD相应的起点是1858年11月17日世界时0时。
计算机的UNIX time是从1970-01-01, 世界时间00:00:00开始至今的秒数。因此,unix time = (JD – 2440587.5) × 86400。
如何计算一个日期的JD呢?
计算方法如下:
设定Y、M、D、h、m、s分别表示年月日,如果M > 2,Y 和 M 不变,如果 M = 1 或 2,则 Y = Y - 1,M = M + 12。
令 A = INT(Y / 100), B = 2 - A + INT(A / 4)
根据时分秒计算含时间的日期 D = D + h / 24.0 + m / 1440.0 + s / 86400.0 ;
最终 JD = INT(365.25 (Y + 4716)) + INT(30.60001 (M + 1)) + D + B -1524.5。
PHP 源码如下:
<? function get_jd($date) { if($date['month'] < 3) { $Y = $date['year'] - 1; $M = $date['month'] + 12; } else { $Y = $date['year']; $M = $date['month']; } $a = floor($Y / 100); $b = 2 - $a + floor($a / 4); $d = $date['day'] + $date['hour'] / 24.0 + $date['minute'] / 1440.0 + $date['second'] / 86400.0; return floor(365.25*($Y + 4716)) + floor(30.6001*($M + 1)) + $d + $b - 1524.5; } ?>
根据 JD 计算日期的算法如下:
首先 JD 加上0.5,然后取其整数部分为 Z,小数部分为 F。
如果 Z < 2299161, 令 A = Z,如果 Z 大于等于 2299161,计算如下,
a = INT((Z - 1867216.25) / 36524.25), A = Z + 1 + a - INT(a / 4)
然后
B = A + 1524
C = INT((B - 122.1) / 265.25)
D = INT(265.25 * C)
E = INT((B - D) / 30.6001)
日期 day = B - D - INT(30.6001 * E)
如果 E < 14,则月份 m = E - 1,否则 m = E - 13
如果月份 m > 2,则年份 year = C - 4716,否则 year = C - 4715
小时 hour = INT(F * 24)
分钟 minute = INT((F - hour / 24.0) * 1440)
秒数(小数) second = ( F - hour / 24.0 - minute / 1440 ) * 86400
PHP 源码:
<? function jd2date($jd) { $Z = floor($jd + 0.5); $F = $jd + 0.5 - $Z; if($Z < 2299161) { $A = $Z; } else { $alf = floor(($Z - 1867216.25) / 36524.25); $A = $Z + 1 + $alf - floor($alf / 4); } $B = $A + 1524; $C = floor(($B - 122.1) / 365.25); $D = floor(365.25 * $C); $E = floor(($B - $D) / 30.6001); $day = $B - $D - floor(30.6001 * $E); if($E < 14) { $month = $E - 1; } else { $month = $E - 13; } if($month > 2) { $year = $C - 4716; } else { $year = $C - 4715; } $hour = floor($F * 24); $F -= $hour / 24.0; $minute = floor($F * 1440); $F -= $minute / 1440.0; $second = $F * 86400; return array( 'hour' => $hour, 'minute' => $minute, 'second' => $second, 'day' => $day, 'month' => $month, 'year' => $year ); } ?>
以上计算方法参考:Jean Meeus著的Astronomical Algorithms,59~65页。