儒略日

儒略日( 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呢?

计算方法如下:

设定YMDhms分别表示年月日,如果M > 2,YM 不变,如果 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'] &lt; 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页。