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

纬度,以度为单位。

longitude

经度,以度为单位。

返回值

返回一个数组,其结构在以下列表中详细说明

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 => 'always',
false => 'never',
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
"Length of day: ",
floor($diff / 3600), "h ",
floor(($diff % 3600) / 60), "s\n";
?>

以上示例将输出

Length of day: 13h 56s

添加笔记

用户贡献笔记 1 条笔记

TheFax
1 年前
在最后一个示例中,从秒到小时、分钟、秒的转换是错误的。
这是正确的版本

<?php
$si
= date_sun_info(strtotime('2022-08-26'), 50.45, 30.52);
$diff = $si['sunset'] - $si['sunrise']; # $diff 以秒为单位。
echo "Length of day: ",
floor($diff / 3600), "h",
floor(($diff % 3600) / 60), "m",
floor($diff % 60), "s\n";
?>

输出
Length of day: 13h53m15s
To Top