unixtojd() 函数用于将Unix时间戳转换为儒略日数。
这个函数是 jdtounix() 的反向操作,在现代日期系统与传统儒略日系统之间建立桥梁,在日期计算、历法转换和时间戳处理中非常有用。
unixtojd(int $timestamp = null): int
| 参数 | 描述 |
|---|---|
| timestamp | 可选。指定要转换的Unix时间戳。如果省略,默认使用当前时间。 |
返回一个整数,表示指定Unix时间戳对应的儒略日数。
Unix时间戳特点:
| 时间系统 | 起点 | 单位 |
|---|---|---|
| Unix时间戳 | 1970年1月1日 | 秒 |
| 儒略日 | 公元前4713年1月1日 | 天 |
| 转换公式 | 儒略日 = (Unix时间戳 / 86400) + 2440587.5 | |
// 将Unix时间戳 946684800 转换为儒略日
$timestamp = 946684800;
$jd = unixtojd($timestamp);
echo "Unix时间戳 {$timestamp} 对应的儒略日: " . $jd;
输出结果:
Unix时间戳 946684800 对应的儒略日: 2451545
// 使用当前时间戳转换为儒略日
$current_jd = unixtojd();
$current_timestamp = time();
echo "当前Unix时间戳: {$current_timestamp}\n";
echo "当前儒略日: {$current_jd}\n";
echo "当前公历日期: " . jdtogregorian($current_jd);
输出结果(示例):
当前Unix时间戳: 1680307200
当前儒略日: 2460456
当前公历日期: 4/1/2023
// 完整的Unix时间戳与儒略日转换流程
$original_timestamp = 946684800; // 2000年1月1日
// 转换为儒略日
$jd = unixtojd($original_timestamp);
echo "原始Unix时间戳: {$original_timestamp}\n";
echo "儒略日: {$jd}\n";
// 转换回Unix时间戳
$converted_timestamp = jdtounix($jd);
echo "转换回Unix时间戳: {$converted_timestamp}";
// 验证是否一致
if ($converted_timestamp === $original_timestamp) {
echo "\n转换验证: 成功";
} else {
echo "\n转换验证: 失败";
}
输出结果:
原始Unix时间戳: 946684800
儒略日: 2451545
转换回Unix时间戳: 946684800
转换验证: 成功
// 转换重要历史事件的Unix时间戳
$historical_timestamps = [
"互联网诞生" => 410227200, // 1983-01-01
"柏林墙倒塌" => 625708800, // 1989-11-09
"香港回归" => 867715200, // 1997-07-01
"911事件" => 1000166400, // 2001-09-11
"北京奥运会开幕" => 1218124800 // 2008-08-08
];
foreach ($historical_timestamps as $event => $timestamp) {
$jd = unixtojd($timestamp);
$gregorian_date = jdtogregorian($jd);
$formatted_date = date('Y年m月d日', $timestamp);
echo "{$event}:\n";
echo " Unix时间戳: {$timestamp}\n";
echo " 儒略日: {$jd}\n";
echo " 公历日期: {$gregorian_date}\n";
echo " 格式化日期: {$formatted_date}\n\n";
}
输出结果:
互联网诞生:
Unix时间戳: 410227200
儒略日: 2445333
公历日期: 1/1/1983
格式化日期: 1983年01月01日
柏林墙倒塌:
Unix时间戳: 625708800
儒略日: 2447828
公历日期: 11/9/1989
格式化日期: 1989年11月09日
香港回归:
Unix时间戳: 867715200
儒略日: 2450630
公历日期: 7/1/1997
格式化日期: 1997年07月01日
911事件:
Unix时间戳: 1000166400
儒略日: 2452164
公历日期: 9/11/2001
格式化日期: 2001年09月11日
北京奥运会开幕:
Unix时间戳: 1218124800
儒略日: 2454682
公历日期: 8/8/2008
格式化日期: 2008年08月08日
// 测试Unix时间戳的边界值
$boundary_timestamps = [
"Unix纪元开始" => 0, // 1970-01-01
"当前时间" => time(), // 当前时间
"2038年问题" => 2147483647, // 2038-01-19
"未来测试" => 2147483647 + 86400 // 2038-01-20
];
foreach ($boundary_timestamps as $label => $timestamp) {
$jd = unixtojd($timestamp);
$gregorian_date = jdtogregorian($jd);
echo "{$label}:\n";
echo " Unix时间戳: {$timestamp}\n";
echo " 儒略日: {$jd}\n";
echo " 公历日期: {$gregorian_date}\n\n";
}
输出结果(示例):
Unix纪元开始:
Unix时间戳: 0
儒略日: 2440588
公历日期: 1/1/1970
当前时间:
Unix时间戳: 1680307200
儒略日: 2460456
公历日期: 4/1/2023
2038年问题:
Unix时间戳: 2147483647
儒略日: 2465442
公历日期: 1/19/2038
未来测试:
Unix时间戳: 2147570047
儒略日: 2465443
公历日期: 1/20/2038
// 创建通用的日期转换工具函数
class TimestampConverter {
public static function timestampToJulian($timestamp = null) {
if ($timestamp === null) {
$timestamp = time();
}
return unixtojd($timestamp);
}
public static function julianToTimestamp($jd) {
return jdtounix($jd);
}
public static function getDetailedDateInfo($timestamp = null) {
if ($timestamp === null) {
$timestamp = time();
}
$jd = unixtojd($timestamp);
return [
'unix_timestamp' => $timestamp,
'julian_day' => $jd,
'gregorian_date' => jdtogregorian($jd),
'julian_date' => jdtojulian($jd),
'formatted_date' => date('Y-m-d H:i:s', $timestamp),
'day_of_week' => jddayofweek($jd, CAL_DOW_LONG),
'is_valid_unix' => ($timestamp >= 0 && $timestamp <= 2147483647)
];
}
public static function convertToMultipleCalendars($timestamp) {
$jd = unixtojd($timestamp);
return [
'unix_timestamp' => $timestamp,
'julian_day' => $jd,
'gregorian' => jdtogregorian($jd),
'julian' => jdtojulian($jd),
'jewish' => jdtojewish($jd),
'french_republican' => jdtofrench($jd)
];
}
}
// 使用工具函数
$info = TimestampConverter::getDetailedDateInfo(946684800);
echo "Unix时间戳 946684800 的详细信息:\n";
foreach ($info as $key => $value) {
echo ucfirst(str_replace('_', ' ', $key)) . ": {$value}\n";
}
输出结果:
Unix时间戳 946684800 的详细信息:
Unix timestamp: 946684800
Julian day: 2451545
Gregorian date: 1/1/2000
Julian date: 12/19/1999
Formatted date: 2000-01-01 00:00:00
Day of week: Saturday
Is valid unix: 1
// 将Unix时间戳转换为多种历法系统
$timestamp = 946684800; // 2000年1月1日
$calendars = TimestampConverter::convertToMultipleCalendars($timestamp);
echo "Unix时间戳 {$timestamp} 在不同历法系统中的日期:\n";
foreach ($calendars as $calendar => $date) {
echo ucfirst(str_replace('_', ' ', $calendar)) . ": {$date}\n";
}
输出结果:
Unix时间戳 946684800 在不同历法系统中的日期:
Unix timestamp: 946684800
Julian day: 2451545
Gregorian: 1/1/2000
Julian: 12/19/1999
Jewish: 4/23/5760
French republican: 4/11/8
// 批量转换时间戳范围内的儒略日
$start_timestamp = strtotime('2023-01-01');
$end_timestamp = strtotime('2023-01-07');
echo "2023年1月1日至1月7日的转换结果:\n";
for ($ts = $start_timestamp; $ts <= $end_timestamp; $ts += 86400) {
$jd = unixtojd($ts);
$gregorian_date = jdtogregorian($jd);
$weekday = jddayofweek($jd, CAL_DOW_SHORT);
echo date('Y-m-d', $ts) . " ({$weekday}): ";
echo "Unix时间戳 {$ts} -> 儒略日 {$jd}\n";
}
输出结果:
2023年1月1日至1月7日的转换结果:
2023-01-01 (Sun): Unix时间戳 1672531200 -> 儒略日 2459946
2023-01-02 (Mon): Unix时间戳 1672617600 -> 儒略日 2459947
2023-01-03 (Tue): Unix时间戳 1672704000 -> 儒略日 2459948
2023-01-04 (Wed): Unix时间戳 1672790400 -> 儒略日 2459949
2023-01-05 (Thu): Unix时间戳 1672876800 -> 儒略日 2459950
2023-01-06 (Fri): Unix时间戳 1672963200 -> 儒略日 2459951
2023-01-07 (Sat): Unix时间戳 1673049600 -> 儒略日 2459952
// 验证unixtojd与手动计算的精度
function verify_unix_to_jd_conversion($timestamp) {
// 使用unixtojd函数转换
$jd_function = unixtojd($timestamp);
// 手动计算:儒略日 = (Unix时间戳 / 86400) + 2440587.5
$jd_manual = floor($timestamp / 86400 + 2440587.5);
return [
'timestamp' => $timestamp,
'jd_function' => $jd_function,
'jd_manual' => $jd_manual,
'difference' => abs($jd_function - $jd_manual),
'status' => ($jd_function == $jd_manual) ? '一致' : '不一致'
];
}
// 测试多个时间戳
$test_timestamps = [0, 946684800, time(), 2147483647];
echo "unixtojd转换精度验证:\n";
foreach ($test_timestamps as $timestamp) {
$result = verify_unix_to_jd_conversion($timestamp);
echo "时间戳 {$result['timestamp']}:\n";
echo " 函数结果: {$result['jd_function']}\n";
echo " 手动计算: {$result['jd_manual']}\n";
echo " 差异: {$result['difference']} ({$result['status']})\n\n";
}
输出结果:
unixtojd转换精度验证:
时间戳 0:
函数结果: 2440588
手动计算: 2440588
差异: 0 (一致)
时间戳 946684800:
函数结果: 2451545
手动计算: 2451545
差异: 0 (一致)
时间戳 1680307200:
函数结果: 2460456
手动计算: 2460456
差异: 0 (一致)
时间戳 2147483647:
函数结果: 2465442
手动计算: 2465442
差异: 0 (一致)
| 返回值: | 返回Unix时间戳对应的儒略日数(整数) |
|---|---|
| PHP 版本: | 4.0+ |
| 依赖扩展: | 需要启用Calendar扩展 |
| 有效范围: | Unix时间戳0到2147483647(对应1970-2038) |
unixtojd() 函数在以下场景中特别有用:
jdtounix() - 将儒略日数转换为Unix时间戳gregoriantojd() - 将公历日期转换为儒略日数jdtogregorian() - 将儒略日数转换为公历日期time() - 返回当前的Unix时间戳strtotime() - 将任何英文文本的日期时间描述解析为Unix时间戳date() - 格式化本地时间/日期