在 PHP 中,date_sunset() 是一个非常实用的函数,用于根据日期和地理位置计算日落时间。然而,单独使用 date_sunset() 往往只能获取有限的信息,比如仅返回日落时间。为了获取更全面的日照信息(如日出、日落、太阳正午、日照时长等),我们可以封装一个自定义函数 sun_info() 来整合 date_sun_info() 和 date_sunset() 的能力,输出更丰富的太阳相关数据。
下面,我们将展示如何实现 sun_info() 函数,并结合 date_sunset() 获取并输出详细的日照信息。
首先,简单介绍两个关键函数的用途:
date_sunset():获取指定时间和地理位置的日落时间。
date_sun_info():返回一个数组,包含日出、日落、黄昏、黎明、太阳正午等详细信息。
虽然 date_sun_info() 的功能更全面,但我们可以利用 date_sunset() 的可配置性(如不同的 zenith 角度)来获取更精细的数据。
我们编写一个函数 sun_info(),该函数接受日期、经度、纬度和时区作为参数,返回一个结构化数组,包含如下信息:
日出时间
日落时间
日照长度(单位:分钟)
太阳正午时间
黄昏(civil dusk)时间
黎明(civil dawn)时间
function sun_info($date, $latitude, $longitude, $timezone = 'UTC') {
$timestamp = strtotime($date);
$sunData = date_sun_info($timestamp, $latitude, $longitude);
$sunset = date_sunset($timestamp, SUNFUNCS_RET_TIMESTAMP, $latitude, $longitude);
$sunrise = date_sunrise($timestamp, SUNFUNCS_RET_TIMESTAMP, $latitude, $longitude);
$daylightMinutes = round(($sunset - $sunrise) / 60);
// 转换为指定时区格式化输出
$dtZone = new DateTimeZone($timezone);
$format = function($ts) use ($dtZone) {
if (!$ts || $ts < 0) return 'N/A';
$dt = new DateTime("@$ts");
$dt->setTimezone($dtZone);
return $dt->format('H:i:s');
};
return [
'sunrise' => $format($sunData['sunrise']),
'sunset' => $format($sunData['sunset']),
'solar_noon' => $format($sunData['solar_noon']),
'civil_dawn' => $format($sunData['civil_twilight_begin']),
'civil_dusk' => $format($sunData['civil_twilight_end']),
'day_length' => $daylightMinutes . ' 分钟',
];
}
假设你希望获取北京在 2025 年 4 月 26 日的日照信息,可以这样调用:
$info = sun_info('2025-04-26', 39.9042, 116.4074, 'Asia/Shanghai');
echo "北京今日太阳信息:<br>";
foreach ($info as $label => $value) {
echo ucfirst(str_replace('_', ' ', $label)) . ': ' . $value . '<br>';
}
输出示例可能如下:
Beijing 今日太阳信息:
Sunrise: 05:21:32
Sunset: 18:57:20
Solar noon: 12:09:26
Civil dawn: 04:53:10
Civil dusk: 19:25:42
Day length: 456 分钟
为了更直观地展示这些日照信息,可以结合 JavaScript 或图表库进一步美化输出效果。你还可以在页面上集成一个链接,例如:
echo '<a href="https://m66.net/sun?lat=39.9&lon=116.4&date=2025-04-26">查看更多日照详情</a>';