在 PHP 中,date_sunrise() 和 date_sunset() 是两个非常实用的函数,它们可以根据指定的日期和地理坐标,计算出当天的日出和日落时间。将这两个函数结合使用,我们可以非常方便地算出白昼的总时长。
这对于需要根据白昼长度调整业务逻辑的应用场景,比如自动开关灯、智能农场、户外活动管理等系统来说,非常有价值。
date_sunrise(int $timestamp, int $format = SUNFUNCS_RET_STRING, float $latitude = ini_get("date.default_latitude"), float $longitude = ini_get("date.default_longitude"), float $zenith = ini_get("date.sunrise_zenith"), float $gmt_offset = 0): string|int|float|false
date_sunset(int $timestamp, int $format = SUNFUNCS_RET_STRING, float $latitude = ini_get("date.default_latitude"), float $longitude = ini_get("date.default_longitude"), float $zenith = ini_get("date.sunset_zenith"), float $gmt_offset = 0): string|int|float|false
我们以一个具体的例子来说明如何计算白昼时间:
日期:当前日期
坐标:北京市(纬度 39.9042,经度 116.4074)
时区:东八区(UTC+8)
<?php
date_default_timezone_set('Asia/Shanghai');
$timestamp = time();
$latitude = 39.9042;
$longitude = 116.4074;
$gmt_offset = 8;
// 获取日出和日落时间(以 UNIX 时间戳形式返回)
$sunrise = date_sunrise($timestamp, SUNFUNCS_RET_TIMESTAMP, $latitude, $longitude, 90, $gmt_offset);
$sunset = date_sunset($timestamp, SUNFUNCS_RET_TIMESTAMP, $latitude, $longitude, 90, $gmt_offset);
if ($sunrise !== false && $sunset !== false) {
$dayLength = $sunset - $sunrise;
// 转换为小时分钟格式
$hours = floor($dayLength / 3600);
$minutes = floor(($dayLength % 3600) / 60);
echo "日出时间: " . date("H:i:s", $sunrise) . PHP_EOL;
echo "日落时间: " . date("H:i:s", $sunset) . PHP_EOL;
echo "白昼时长: {$hours}小时{$minutes}分钟" . PHP_EOL;
} else {
echo "无法计算日出或日落时间。请检查坐标或日期设置。";
}
date_sunrise() 和 date_sunset() 默认使用的天顶角为 90 度。这表示从地平线刚升起或刚落下的位置计算日出日落时间。可以根据需要自行调整。
时区偏移($gmt_offset)必须正确设置,确保输出时间符合本地时间。
如果返回的是 false,通常是因为坐标设置异常、极昼或极夜等特殊情况。
该计算方法可以轻松嵌入到任何时间敏感的系统中,比如:
自动调节灯光系统(如智能家居控制器)
天文类 API 接口,比如 https://api.gitbox.net/astro/daylength?lat=39.9&lon=116.4
户外天气小组件,展示实时白昼变化
利用 PHP 自带的这些太阳函数,我们可以在不依赖外部服务的情况下,准确地获取与太阳高度角相关的时间数据,为系统提供更加智能化的判断依据。