PHP Conference Japan 2024

date_sun_info

(PHP 5 >= 5.1.2, PHP 7, PHP 8)

date_sun_info返回包含日落/日出和曙光/暮光開始/結束資訊的陣列

說明

date_sun_info(int $timestamp, float $latitude, float $longitude): array

參數

timestamp

Unix 時間戳記。

latitude

緯度(以度為單位)。

經度

經度(以度為單位)。

回傳值

返回一個陣列,其結構詳述如下:

sunrise(日出)
日出的時間戳記(天頂角 = 90°35')。
sunset(日落)
日落的時間戳記(天頂角 = 90°35')。
transit(中天)
太陽位於天頂的時間戳記,即達到最高點的時刻。
civil_twilight_begin(民用曙光開始)
民用曙光的開始時間(天頂角 = 96°)。它結束於 sunrise
civil_twilight_end(民用暮光結束)
民用暮光的結束時間(天頂角 = 96°)。它開始於 sunset
nautical_twilight_begin(航海曙光開始)
航海曙光的開始時間(天頂角 = 102°)。它結束於 civil_twilight_begin
nautical_twilight_end(航海暮光結束)
航海暮光的結束時間(天頂角 = 102°)。它開始於 civil_twilight_end
astronomical_twilight_begin(天文曙光開始)
天文曙光的開始時間(天頂角 = 108°)。它結束於 nautical_twilight_begin
astronomical_twilight_end(天文暮光結束)
天文暮光的結束時間(天頂角 = 108°)。它開始於 nautical_twilight_end

陣列元素的值可以是 UNIX 時間戳記,如果太陽整天都在相應天頂角以下,則為 false;如果太陽整天都在相應天頂角以上,則為 true

更新日誌

版本 說明
7.2.0 已修正關於本地午夜而非本地正午的計算,這會稍微改變結果。

範例

範例 #1 date_sun_info() 範例

<?php
$sun_info
= date_sun_info(strtotime("2006-12-12"), 31.7667, 35.2333);
foreach (
$sun_info as $key => $val) {
echo
"$key: " . date("H:i:s", $val) . "\n";
}
?>

上述範例將輸出:

sunrise: 05:52:11
sunset: 15:41:21
transit: 10:46:46
civil_twilight_begin: 05:24:08
civil_twilight_end: 16:09:24
nautical_twilight_begin: 04:52:25
nautical_twilight_end: 16:41:06
astronomical_twilight_begin: 04:21:32
astronomical_twilight_end: 17:12:00

範例 #2 極夜,搭配一些處理

<?php
$tz
= new \DateTimeZone('America/Anchorage');

$si = date_sun_info(strtotime("2022-12-21"), 70.21, -148.51);
foreach (
$si as $key => $value) {
echo
match (
$value) {
true => '總是',
false => '永不',
default =>
date_create("@{$value}")->setTimeZone($tz)->format( 'H:i:s T' ),
},
": {$key}",
"\n";
}
?>

上述範例將輸出:

never: sunrise
never: sunset
12:52:18 AKST: transit
10:53:19 AKST: civil_twilight_begin
14:51:17 AKST: civil_twilight_end
09:01:47 AKST: nautical_twilight_begin
16:42:48 AKST: nautical_twilight_end
07:40:47 AKST: astronomical_twilight_begin
18:03:49 AKST: astronomical_twilight_end

範例 #3 永晝 (挪威特羅姆瑟)

<?php
$si
= date_sun_info(strtotime("2022-06-26"), 69.68, 18.94);
print_r($si);
?>

上述範例將輸出:

Array
(
    [sunrise] => 1
    [sunset] => 1
    [transit] => 1656240426
    [civil_twilight_begin] => 1
    [civil_twilight_end] => 1
    [nautical_twilight_begin] => 1
    [nautical_twilight_end] => 1
    [astronomical_twilight_begin] => 1
    [astronomical_twilight_end] => 1
)

範例 #4 計算白天長度 (基輔)

<?php
$si
= date_sun_info(strtotime('2022-08-26'), 50.45, 30.52);
$diff = $si['sunset'] - $si['sunrise'];
echo
"白天長度:",
floor($diff / 3600), "小時 ",
floor(($diff % 3600) / 60), "秒\n";
?>

上述範例將輸出:

Length of day: 13h 56s

新增註記

使用者貢獻的註記 1 則註記

TheFax
2 年前
在最後一個範例中,從秒數轉換為小時、分鐘、秒數是錯誤的。
這是正確的版本

<?php
$si
= date_sun_info(strtotime('2022-08-26'), 50.45, 30.52);
$diff = $si['sunset'] - $si['sunrise']; # $diff 以秒為單位。
echo "白天長度: ",
floor($diff / 3600), "小時",
floor(($diff % 3600) / 60), "分鐘",
floor($diff % 60), "秒\n";
?>

輸出
白天長度: 13小時53分鐘15秒
To Top