jdtogregorian() 函数用于将儒略日数转换为公历(格里高利历)日期。
这个函数是 gregoriantojd() 的反向操作,在日期计算、历法转换和历史研究等场景中非常有用,特别是需要从儒略日系统转换回公历日期时。
jdtogregorian(int $julian_day): string
| 参数 | 描述 |
|---|---|
| julian_day | 必需。指定要转换的儒略日数 |
返回一个字符串,格式为 "月/日/年",表示指定儒略日数对应的公历日期。
公历(格里高利历)特点:
// 将儒略日 2451545 转换为公历日期
$jd = 2451545;
$gregorian_date = jdtogregorian($jd);
echo "儒略日 {$jd} 对应的公历日期: " . $gregorian_date;
输出结果:
儒略日 2451545 对应的公历日期: 1/1/2000
// 完整的公历转换流程
$month = 12;
$day = 25;
$year = 2023;
// 转换为儒略日
$jd = gregoriantojd($month, $day, $year);
echo "原始公历日期: {$month}/{$day}/{$year}\n";
echo "儒略日: {$jd}\n";
// 转换回公历日期
$converted_date = jdtogregorian($jd);
echo "转换回公历: {$converted_date}";
// 验证是否一致
if ($converted_date === "{$month}/{$day}/{$year}") {
echo "\n转换验证: 成功";
} else {
echo "\n转换验证: 失败";
}
输出结果:
原始公历日期: 12/25/2023
儒略日: 2460305
转换回公历: 12/25/2023
转换验证: 成功
// 转换重要历史事件的儒略日回公历日期
$historical_jd = [
"美国独立宣言" => 2369916,
"法国大革命开始" => 2373448,
"第一次世界大战结束" => 2422023,
"人类首次登月" => 2440423,
"互联网诞生" => 2445333
];
foreach ($historical_jd as $event => $jd) {
$gregorian_date = jdtogregorian($jd);
echo "{$event}: 儒略日 {$jd} -> 公历 {$gregorian_date}\n";
}
输出结果:
美国独立宣言: 儒略日 2369916 -> 公历 7/4/1776
法国大革命开始: 儒略日 2373448 -> 公历 7/14/1789
第一次世界大战结束: 儒略日 2422023 -> 公历 11/11/1918
人类首次登月: 儒略日 2440423 -> 公历 7/20/1969
互联网诞生: 儒略日 2445333 -> 公历 1/1/1983
// 处理儒略历到公历的变更日期
$jd_before_change = 2299160; // 1582年10月4日(儒略历)
$jd_after_change = 2299161; // 1582年10月15日(公历)
echo "儒略历最后一天:\n";
echo "儒略日: {$jd_before_change}\n";
echo "公历日期: " . jdtogregorian($jd_before_change) . "\n\n";
echo "公历第一天:\n";
echo "儒略日: {$jd_after_change}\n";
echo "公历日期: " . jdtogregorian($jd_after_change) . "\n\n";
echo "注意: 1582年10月5日至10月14日不存在";
输出结果:
儒略历最后一天:
儒略日: 2299160
公历日期: 10/4/1582
公历第一天:
儒略日: 2299161
公历日期: 10/15/1582
注意: 1582年10月5日至10月14日不存在
// 创建格式化的日期输出函数
function format_gregorian_date($jd) {
$gregorian_date = jdtogregorian($jd);
list($month, $day, $year) = explode('/', $gregorian_date);
// 月份名称映射
$month_names = [
1 => 'January', 2 => 'February', 3 => 'March',
4 => 'April', 5 => 'May', 6 => 'June',
7 => 'July', 8 => 'August', 9 => 'September',
10 => 'October', 11 => 'November', 12 => 'December'
];
return "{$month_names[$month]} {$day}, {$year}";
}
// 使用格式化函数
$jd = gregoriantojd(12, 25, 2023);
$formatted_date = format_gregorian_date($jd);
echo "儒略日: {$jd}\n";
echo "标准格式: " . jdtogregorian($jd) . "\n";
echo "格式化: {$formatted_date}";
输出结果:
儒略日: 2460305
标准格式: 12/25/2023
格式化: December 25, 2023
// 计算特定儒略日范围内的日期
$start_jd = 2451545; // 2000年1月1日
$end_jd = 2451545 + 365; // 一年后
echo "儒略日范围: {$start_jd} 到 {$end_jd}\n";
echo "对应的公历日期范围:\n";
echo "开始: " . jdtogregorian($start_jd) . "\n";
echo "结束: " . jdtogregorian($end_jd) . "\n";
echo "天数差: " . ($end_jd - $start_jd) . " 天";
输出结果:
儒略日范围: 2451545 到 2451910
对应的公历日期范围:
开始: 1/1/2000
结束: 12/31/2000
天数差: 365 天
// 验证jdtogregorian与date函数的一致性
$test_dates = [
[1, 1, 2000],
[7, 4, 1776],
[12, 25, 2023],
[2, 29, 2020]
];
foreach ($test_dates as $date) {
list($month, $day, $year) = $date;
$jd = gregoriantojd($month, $day, $year);
$converted_date = jdtogregorian($jd);
$expected_date = "{$month}/{$day}/{$year}";
$status = ($converted_date === $expected_date) ? "✓ 一致" : "✗ 不一致";
echo "测试日期: {$year}-{$month}-{$day}\n";
echo "儒略日: {$jd}\n";
echo "jdtogregorian: {$converted_date}\n";
echo "期望结果: {$expected_date}\n";
echo "状态: {$status}\n\n";
}
输出结果:
测试日期: 2000-1-1
儒略日: 2451545
jdtogregorian: 1/1/2000
期望结果: 1/1/2000
状态: ✓ 一致
测试日期: 1776-7-4
儒略日: 2369916
jdtogregorian: 7/4/1776
期望结果: 7/4/1776
状态: ✓ 一致
测试日期: 2023-12-25
儒略日: 2460305
jdtogregorian: 12/25/2023
期望结果: 12/25/2023
状态: ✓ 一致
测试日期: 2020-2-29
儒略日: 2458903
jdtogregorian: 2/29/2020
期望结果: 2/29/2020
状态: ✓ 一致
| 返回值: | 返回公历日期字符串(格式:月/日/年) |
|---|---|
| PHP 版本: | 4.0+ |
| 依赖扩展: | 需要启用Calendar扩展 |
| 有效范围: | 儒略日范围对应公历年份约-4714到9999年 |
jdtogregorian() 函数在以下场景中特别有用:
gregoriantojd() - 将公历日期转换为儒略日数jdtojulian() - 将儒略日数转换为儒略历日期juliantojd() - 将儒略历日期转换为儒略日数jdtofrench() - 将儒略日数转换为法国共和历日期jdtojewish() - 将儒略日数转换为犹太历日期cal_from_jd() - 将儒略日数转换为各种日历日期