在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>';