jdtounix() 函数用于将儒略日数转换为Unix时间戳。
Unix时间戳是从1970年1月1日00:00:00 GMT开始的秒数,是现代计算机系统中广泛使用的时间表示方法。这个函数在需要将传统儒略日转换为现代时间戳系统的应用中非常有用。
jdtounix(int $julian_day): int
| 参数 | 描述 |
|---|---|
| julian_day | 必需。指定要转换的儒略日数 |
返回一个整数,表示指定儒略日数对应的Unix时间戳。如果儒略日不在Unix时间戳的有效范围内(1970-2038),返回false。
Unix时间戳特点:
| 系统类型 | 最小儒略日 | 最大儒略日 |
|---|---|---|
| 32位系统 | 2440588 | 2465442 |
| 64位系统 | 2440588 | 理论无限制 |
对应日期范围:1970年1月1日 到 2038年1月19日(32位系统)
// 将儒略日 2451545 转换为Unix时间戳
$jd = 2451545;
$timestamp = jdtounix($jd);
echo "儒略日 {$jd} 对应的Unix时间戳: " . $timestamp;
输出结果:
儒略日 2451545 对应的Unix时间戳: 946684800
// 验证jdtounix转换的正确性
$jd = 2451545; // 2000年1月1日
$timestamp = jdtounix($jd);
$date_from_timestamp = date('Y-m-d H:i:s', $timestamp);
$date_from_jd = jdtogregorian($jd);
echo "儒略日: {$jd}\n";
echo "Unix时间戳: {$timestamp}\n";
echo "从时间戳转换的日期: {$date_from_timestamp}\n";
echo "从儒略日转换的日期: {$date_from_jd}";
输出结果:
儒略日: 2451545
Unix时间戳: 946684800
从时间戳转换的日期: 2000-01-01 00:00:00
从儒略日转换的日期: 1/1/2000
// 测试Unix时间戳的边界日期
$boundary_dates = [
"Unix纪元开始" => 2440588, // 1970-01-01
"当前时间" => unixtojd(time()), // 当前儒略日
"2038年问题" => 2465442 // 2038-01-19
];
foreach ($boundary_dates as $label => $jd) {
$timestamp = jdtounix($jd);
if ($timestamp === false) {
echo "{$label}: 儒略日 {$jd} -> 超出范围\n";
} else {
$date = date('Y-m-d H:i:s', $timestamp);
echo "{$label}: 儒略日 {$jd} -> {$timestamp} ({$date})\n";
}
}
输出结果(示例):
Unix纪元开始: 儒略日 2440588 -> 0 (1970-01-01 00:00:00)
当前时间: 儒略日 2460456 -> 1680307200 (2023-04-01 00:00:00)
2038年问题: 儒略日 2465442 -> 2147483647 (2038-01-19 03:14:07)
// 转换重要历史事件的Unix时间戳
$historical_dates = [
"互联网诞生" => [1, 1, 1983],
"柏林墙倒塌" => [11, 9, 1989],
"香港回归" => [7, 1, 1997],
"911事件" => [9, 11, 2001]
];
foreach ($historical_dates as $event => $date) {
list($month, $day, $year) = $date;
$jd = gregoriantojd($month, $day, $year);
$timestamp = jdtounix($jd);
$formatted_date = date('Y年m月d日', $timestamp);
echo "{$event}:\n";
echo " 儒略日: {$jd}\n";
echo " Unix时间戳: {$timestamp}\n";
echo " 格式化日期: {$formatted_date}\n\n";
}
输出结果:
互联网诞生:
儒略日: 2445333
Unix时间戳: 410227200
格式化日期: 1983年01月01日
柏林墙倒塌:
儒略日: 2447828
Unix时间戳: 625708800
格式化日期: 1989年11月09日
香港回归:
儒略日: 2450630
Unix时间戳: 867715200
格式化日期: 1997年07月01日
911事件:
儒略日: 2452164
Unix时间戳: 1000166400
格式化日期: 2001年09月11日
// 处理超出Unix时间戳范围的日期
function safe_jdtounix($jd) {
$timestamp = jdtounix($jd);
if ($timestamp === false) {
return "儒略日 {$jd} 超出Unix时间戳范围";
} else {
return date('Y-m-d H:i:s', $timestamp);
}
}
// 测试不同时期的日期
$test_jd = [
2299160, // 1582年(历法改革)
2440587, // 1969-12-31(Unix纪元前一天)
2440588, // 1970-01-01(Unix纪元)
2465442, // 2038-01-19(32位系统最大值)
2465443 // 2038-01-20(超出32位系统范围)
];
foreach ($test_jd as $jd) {
$result = safe_jdtounix($jd);
$julian_date = jdtojulian($jd);
echo "儒略日 {$jd} ({$julian_date}): {$result}\n";
}
输出结果:
儒略日 2299160 (10/4/1582): 儒略日 2299160 超出Unix时间戳范围
儒略日 2440587 (12/31/1969): 儒略日 2440587 超出Unix时间戳范围
儒略日 2440588 (1/1/1970): 1970-01-01 00:00:00
儒略日 2465442 (1/19/2038): 2038-01-19 03:14:07
儒略日 2465443 (1/20/2038): 儒略日 2465443 超出Unix时间戳范围
// 创建通用的日期转换工具函数
class DateConverter {
public static function gregorianToUnix($month, $day, $year) {
$jd = gregoriantojd($month, $day, $year);
return jdtounix($jd);
}
public static function unixToGregorian($timestamp) {
$jd = unixtojd($timestamp);
return jdtogregorian($jd);
}
public static function getDateInfo($month, $day, $year) {
$jd = gregoriantojd($month, $day, $year);
$timestamp = jdtounix($jd);
return [
'julian_day' => $jd,
'unix_timestamp' => $timestamp,
'gregorian_date' => jdtogregorian($jd),
'formatted_date' => $timestamp !== false ? date('Y-m-d H:i:s', $timestamp) : '超出范围',
'day_of_week' => jddayofweek($jd, CAL_DOW_LONG)
];
}
}
// 使用工具函数
$info = DateConverter::getDateInfo(12, 25, 2023);
echo "2023年圣诞节日期信息:\n";
foreach ($info as $key => $value) {
echo ucfirst(str_replace('_', ' ', $key)) . ": {$value}\n";
}
输出结果:
2023年圣诞节日期信息:
Julian day: 2460305
Unix timestamp: 1703462400
Gregorian date: 12/25/2023
Formatted date: 2023-12-25 00:00:00
Day of week: Monday
// 批量转换日期范围内的儒略日
$start_jd = gregoriantojd(1, 1, 2020);
$end_jd = gregoriantojd(1, 7, 2020);
echo "2020年1月1日至1月7日的转换结果:\n";
for ($jd = $start_jd; $jd <= $end_jd; $jd++) {
$timestamp = jdtounix($jd);
$gregorian_date = jdtogregorian($jd);
$weekday = jddayofweek($jd, CAL_DOW_SHORT);
echo "{$gregorian_date} ({$weekday}): 儒略日 {$jd} -> Unix时间戳 {$timestamp}\n";
}
输出结果:
2020年1月1日至1月7日的转换结果:
1/1/2020 (Wed): 儒略日 2458850 -> Unix时间戳 1577836800
1/2/2020 (Thu): 儒略日 2458851 -> Unix时间戳 1577923200
1/3/2020 (Fri): 儒略日 2458852 -> Unix时间戳 1578009600
1/4/2020 (Sat): 儒略日 2458853 -> Unix时间戳 1578096000
1/5/2020 (Sun): 儒略日 2458854 -> Unix时间戳 1578182400
1/6/2020 (Mon): 儒略日 2458855 -> Unix时间戳 1578268800
1/7/2020 (Tue): 儒略日 2458856 -> Unix时间戳 1578355200
| 返回值: | 返回Unix时间戳(整数)或false(超出范围) |
|---|---|
| PHP 版本: | 4.0+ |
| 依赖扩展: | 需要启用Calendar扩展 |
| 有效范围: | 儒略日2440588到2465442(对应1970-2038) |
jdtounix() 函数在以下场景中特别有用:
unixtojd() - 将Unix时间戳转换为儒略日数gregoriantojd() - 将公历日期转换为儒略日数jdtogregorian() - 将儒略日数转换为公历日期time() - 返回当前的Unix时间戳date() - 格式化本地时间/日期strtotime() - 将任何英文文本的日期时间描述解析为Unix时间戳