PHP Conference Japan 2024

gregoriantojd

(PHP 4, PHP 5, PHP 7, PHP 8)

gregoriantojd將格里高利日期轉換為儒略日計數

說明

gregoriantojd(int $month, int $day, int $year): int

格里高利曆法的有效範圍是從公元前 4714 年 11 月 25 日到至少公元 9999 年 12 月 31 日。

雖然此函式可以處理遠至公元前 4714 年的日期,但這樣的使用可能沒有意義。格里高利曆法直到 1582 年 10 月 15 日(儒略曆的 1582 年 10 月 5 日)才開始實施。有些國家直到很久以後才採用它。例如,英國在 1752 年改用,蘇聯在 1918 年,希臘在 1923 年。大多數歐洲國家在格里高利曆法之前使用儒略曆。

參數

month(月份)

月份,以數字表示,從 1(一月)到 12(十二月)。

day(日期)

日期,以數字表示,從 1 到 31。如果給定的日期超過該月份的天數,則會發生溢位;請參見下面的範例。

year(年份)

年份,以數字表示,介於 -4714 和 9999 之間。負數表示公元前,正數表示公元。請注意,沒有 0 年;公元前 1 年 12 月 31 日之後緊接著是公元 1 年 1 月 1 日。

傳回值

給定格里高利日期的儒略日,以整數表示。有效範圍外的日期會傳回 0

範例

範例 #1 日曆函式

<?php
$jd
= gregoriantojd(10, 11, 1970);
echo
"$jd\n";
$gregorian = jdtogregorian($jd);
echo
"$gregorian\n";
?>

以上範例會輸出:

2440871
10/11/1970

範例 #2 溢位行為

<?php
echo gregoriantojd(2, 31, 2018), PHP_EOL,
gregoriantojd(3, 3, 2018), PHP_EOL;
?>

以上範例會輸出:

2458181
2458181

參見

新增註解

使用者貢獻的註解 3 則註解

jettyrat at jettyfishing dot com
19 年前
您可以使用 PHP 的 gregoriantojd() 函式或下方顯示的函式,將此程式碼應用於傳回值,以取得儒略日的十進位小數部分。

<?php
$julianDate
= gregoriantojd($month, $day, $year);

//修正半天的偏移量
$dayfrac = date('G') / 24 - .5;
if (
$dayfrac < 0) $dayfrac += 1;

//現在設定一天的小數部分
$frac = $dayfrac + (date('i') + date('s') / 60) / 60 / 24;

$julianDate = $julianDate + $frac;
?>
httpwebwitch
20 年前
這個函式也會忽略儒略日日期中的小數部分,而且它使用非標準格式來返回格里高利日期。

因此,如果您的儒略日日期是 2453056.28673,則返回的格里高利日期值是 2/20/2004,而不是「2004-02-20 23:45:36」。

小數部分很重要,因為儒略日從中午開始,例如 2453056.49 是星期五,2453056.50 是星期六。捨棄小數部分意味著您返回的格里高利日期在 50% 的情況下會是錯誤的。
jfg
15 年前
如果您需要與 GlibC 的 g_date_get_julian 函式相同的輸出,以下是我用 PHP 實作的版本

<?php
/**
* Glib g_date_get_julian PHP 實作
*
* @param $str strtotime 可接受格式的日期字串
* @author jfg
*/
private function _get_julian( $str )
{
$d = date_create($str);

if(
$d == false )
return
0;

$day_in_year = (int) date_format($d, "z");
$year = (int) date_format($d, "Y") - 1;
$julian_days = $year * 365;
$julian_days += ($year >>= 2);
$julian_days -= ($year /= 25);
$julian_days += $year >> 2;
$julian_days += $day_in_year + 1;

return
ceil($julian_days);
}

?>
To Top