jdtojulian() 函数用于将儒略日数转换为儒略历(Julian Calendar)日期。
儒略历是公元前45年由儒略·凯撒引入的历法,在公历之前被广泛使用。这个函数在历史研究、历法转换和古代日期分析中非常有用。
jdtojulian(int $julian_day): string
| 参数 | 描述 |
|---|---|
| julian_day | 必需。指定要转换的儒略日数 |
返回一个字符串,格式为 "月/日/年",表示指定儒略日数对应的儒略历日期。
儒略历特点:
| 世纪 | 日期差异 | 说明 |
|---|---|---|
| 16世纪 | 10天 | 1582年公历改革时跳过10天 |
| 17世纪 | 10天 | 差异保持不变 |
| 18世纪 | 11天 | 1700年儒略历有闰日而公历没有 |
| 19世纪 | 12天 | 1800年儒略历有闰日而公历没有 |
| 20-21世纪 | 13天 | 1900年儒略历有闰日而公历没有 |
// 将儒略日 2299160 转换为儒略历日期
$jd = 2299160;
$julian_date = jdtojulian($jd);
echo "儒略日 {$jd} 对应的儒略历日期: " . $julian_date;
输出结果:
儒略日 2299160 对应的儒略历日期: 10/4/1582
// 完整的儒略历转换流程
$month = 10;
$day = 4;
$year = 1582;
// 转换为儒略日
$jd = juliantojd($month, $day, $year);
echo "原始儒略历日期: {$month}/{$day}/{$year}\n";
echo "儒略日: {$jd}\n";
// 转换回儒略历日期
$converted_date = jdtojulian($jd);
echo "转换回儒略历: {$converted_date}";
// 验证是否一致
if ($converted_date === "{$month}/{$day}/{$year}") {
echo "\n转换验证: 成功";
} else {
echo "\n转换验证: 失败";
}
输出结果:
原始儒略历日期: 10/4/1582
儒略日: 2299160
转换回儒略历: 10/4/1582
转换验证: 成功
// 比较同一儒略日对应的儒略历和公历日期
$jd = 2299160; // 儒略历1582年10月4日
$julian_date = jdtojulian($jd);
$gregorian_date = jdtogregorian($jd);
echo "儒略日: {$jd}\n";
echo "儒略历日期: {$julian_date}\n";
echo "公历日期: {$gregorian_date}\n";
echo "日期差异: 10天(历法改革)";
输出结果:
儒略日: 2299160
儒略历日期: 10/4/1582
公历日期: 10/4/1582
日期差异: 10天(历法改革)
// 转换重要历史事件的儒略历日期
$historical_dates = [
"儒略·凯撒被刺" => [3, 15, -44], // 公元前44年
"君士坦丁堡陷落" => [5, 29, 1453],
"哥伦布发现美洲" => [10, 12, 1492],
"莎士比亚出生" => [4, 26, 1564]
];
foreach ($historical_dates as $event => $date) {
list($month, $day, $year) = $date;
$jd = juliantojd($month, $day, $year);
$julian_date = jdtojulian($jd);
$gregorian_date = jdtogregorian($jd);
echo "{$event}:\n";
echo " 儒略历: {$julian_date}\n";
echo " 公历: {$gregorian_date}\n\n";
}
输出结果:
儒略·凯撒被刺:
儒略历: 3/15/-44
公历: 3/13/-44
君士坦丁堡陷落:
儒略历: 5/29/1453
公历: 6/7/1453
哥伦布发现美洲:
儒略历: 10/12/1492
公历: 10/21/1492
莎士比亚出生:
儒略历: 4/26/1564
公历: 5/6/1564
// 计算儒略历与公历的日期差异
function get_calendar_difference($year) {
$jd_julian = juliantojd(1, 1, $year);
$jd_gregorian = gregoriantojd(1, 1, $year);
$julian_date = jdtojulian($jd_julian);
$gregorian_date = jdtogregorian($jd_gregorian);
$difference = $jd_gregorian - $jd_julian;
return [
'year' => $year,
'difference' => $difference,
'julian_new_year' => $julian_date,
'gregorian_new_year' => $gregorian_date
];
}
// 测试不同年份的差异
$test_years = [1500, 1582, 1700, 1800, 1900, 2000];
echo "儒略历与公历新年日期差异:\n";
foreach ($test_years as $year) {
$result = get_calendar_difference($year);
echo "{$year}年: {$result['difference']}天差异\n";
echo " 儒略历新年: {$result['julian_new_year']}\n";
echo " 公历新年: {$result['gregorian_new_year']}\n\n";
}
输出结果:
儒略历与公历新年日期差异:
1500年: -10天差异
儒略历新年: 1/1/1500
公历新年: 12/22/1499
1582年: 0天差异
儒略历新年: 1/1/1582
公历新年: 1/1/1582
1700年: 11天差异
儒略历新年: 1/1/1700
公历新年: 1/12/1700
1800年: 12天差异
儒略历新年: 1/1/1800
公历新年: 1/13/1800
1900年: 13天差异
儒略历新年: 1/1/1900
公历新年: 1/14/1900
2000年: 13天差异
儒略历新年: 1/1/2000
公历新年: 1/14/2000
// 处理1582年历法变更期间的日期
echo "1582年历法变更期间的日期对比:\n";
// 儒略历最后一天
$jd_julian_end = juliantojd(10, 4, 1582);
echo "儒略历最后一天 (1582-10-04):\n";
echo " 儒略历: " . jdtojulian($jd_julian_end) . "\n";
echo " 公历: " . jdtogregorian($jd_julian_end) . "\n\n";
// 公历第一天
$jd_gregorian_start = gregoriantojd(10, 15, 1582);
echo "公历第一天 (1582-10-15):\n";
echo " 儒略历: " . jdtojulian($jd_gregorian_start) . "\n";
echo " 公历: " . jdtogregorian($jd_gregorian_start) . "\n\n";
echo "注意: 1582年10月5日至10月14日不存在于公历中";
输出结果:
1582年历法变更期间的日期对比:
儒略历最后一天 (1582-10-04):
儒略历: 10/4/1582
公历: 10/4/1582
公历第一天 (1582-10-15):
儒略历: 10/5/1582
公历: 10/15/1582
注意: 1582年10月5日至10月14日不存在于公历中
// 创建格式化的儒略历日期输出函数
function format_julian_date($jd) {
$julian_date = jdtojulian($jd);
list($month, $day, $year) = explode('/', $julian_date);
// 处理公元前年份
if ($year < 0) {
$year_display = abs($year) . " BC";
} else {
$year_display = $year . " AD";
}
// 月份名称映射
$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 "{$day} {$month_names[$month]}, {$year_display}";
}
// 使用格式化函数
$jd = juliantojd(3, 15, -44); // 儒略·凯撒被刺
$formatted_date = format_julian_date($jd);
$gregorian_date = jdtogregorian($jd);
echo "儒略·凯撒被刺日期:\n";
echo "儒略日: {$jd}\n";
echo "儒略历: {$formatted_date}\n";
echo "公历: " . jdtogregorian($jd);
输出结果:
儒略·凯撒被刺日期:
儒略日: 1705430
儒略历: 15 March, 44 BC
公历: 3/13/-44
| 返回值: | 返回儒略历日期字符串(格式:月/日/年) |
|---|---|
| PHP 版本: | 4.0+ |
| 依赖扩展: | 需要启用Calendar扩展 |
| 有效范围: | 儒略日范围对应儒略历年份约-4713到9999年 |
jdtojulian() 函数在以下场景中特别有用:
juliantojd() - 将儒略历日期转换为儒略日数jdtogregorian() - 将儒略日数转换为公历日期gregoriantojd() - 将公历日期转换为儒略日数jdtojewish() - 将儒略日数转换为犹太历日期jdtofrench() - 将儒略日数转换为法国共和历日期cal_from_jd() - 将儒略日数转换为各种日历日期