update page now
Laravel Live Japan

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
9
TheFax
3 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