PHP 8.4.2 Released!

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"
;

?>

Результат выполнения приведённого примера:

Продолжительность дня: 13 ч. 56 сек.

Смотрите также

  • date_sunrise() - Возвращает время рассвета для заданных дня и местоположения
  • date_sunset() - Возвращает время захода солнца для заданных дня и расположения

Добавить

Примечания пользователей 1 note

up
8
TheFax
2 years ago
In the last example, conversion from seconds to Hour, Minutes, Seconds is wrong.
This is the correct verion:

<?php
$si
= date_sun_info(strtotime('2022-08-26'), 50.45, 30.52);
$diff = $si['sunset'] - $si['sunrise']; # $diff is measured in seconds.
echo "Length of day: ",
floor($diff / 3600), "h",
floor(($diff % 3600) / 60), "m",
floor($diff % 60), "s\n";
?>

Output:
Length of day: 13h53m15s
To Top