
本文详解如何调用 PHP 内置函数 date_sun_info() 获取指定经纬度下的日出、日落等天文时间,并通过数组键名精准提取所需值,同时提供健壮性处理与实用示例。
本文详解如何调用 php 内置函数 `date_sun_info()` 获取指定经纬度下的日出、日落等天文时间,并通过数组键名精准提取所需值,同时提供健壮性处理与实用示例。
PHP 的 date_sun_info() 是一个强大且轻量的内置函数,用于计算给定日期和地理坐标(纬度 $lat、经度 $lon)下的太阳事件时间戳,包括日出(sunrise)、日落(sunset)、民用晨昏蒙影开始/结束(civil_twilight_begin / civil_twilight_end)、天文晨昏蒙影(nautical_twilight_begin / nautical_twilight_end)、天文正午(transit)以及黑夜开始(dawn)等共 7 个关键时间点。
该函数返回一个关联数组,所有时间均以 Unix 时间戳(秒级整数)形式存储,因此需配合 date() 函数格式化输出。正确提取单个值的关键在于:直接使用数组键名访问,而非遍历——既高效又语义清晰。
以下为推荐的标准用法:
<?php
// 设置目标日期(当前日)和地理位置(示例:北京约 39.9°N, 116.4°E)
$targetDate = strtotime(date('Y-m-d'));
$lat = 39.9042; // 纬度(北纬为正)
$lon = 116.4074; // 经度(东经为正)
$sun_info = date_sun_info($targetDate, $lat, $lon);
// ✅ 关键:检查函数是否成功执行(可能因无效坐标或极地地区返回 false)
if ($sun_info === false) {
throw new RuntimeException('date_sun_info failed: invalid coordinates or date');
}
// ? 精准提取所需时间戳
$sunrise_ts = $sun_info['sunrise']; // 日出时间戳
$sunset_ts = $sun_info['sunset']; // 日落时间戳
$transit_ts = $sun_info['transit']; // 太阳中天(正午)时间戳
// ? 格式化为可读时间(注意:结果为本地服务器时区时间)
echo "日出:" . date('H:i:s', $sunrise_ts) . "\n";
echo "日落:" . date('H:i:s', $sunset_ts) . "\n";
echo "正午:" . date('H:i:s', $transit_ts) . "\n";
?>⚠️ 重要注意事项:
立即学习“PHP免费学习笔记(深入)”;
- date_sun_info() 不自动处理时区转换,返回的时间戳基于 UTC,但 date() 默认使用服务器本地时区。如需显示目标地理位置的本地时间,建议先用 date_default_timezone_set() 切换至对应时区(如 'Asia/Shanghai'),或使用 DateTime 类进行显式时区转换;
- $lat 和 $lon 必须为浮点数,且纬度范围应为 -90 至 90,经度为 -180 至 180,否则函数将返回 false;
- 在极昼/极夜区域(如高纬度冬季),部分键(如 sunrise 或 sunset)可能为 false,需额外判断:
$sunrise = $sun_info['sunrise'] ?: '—'; // 避免警告
✅ 总结:避免无意义的 foreach 遍历,直接通过 $sun_info['sunrise'] 和 $sun_info['sunset'] 获取对应时间戳,再结合 date() 格式化输出,是简洁、安全、符合语义的最佳实践。完整键名列表及行为说明请参考 PHP 官方文档。



















