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

纬度(度)。

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
"日长: ",
floor($diff / 3600), "小时 ",
floor(($diff % 3600) / 60), "秒\n";
?>

以上示例将输出

Length of day: 13h 56s

添加备注

用户贡献的笔记 1 条笔记

9
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