Возвращает массив с информацией о закате и восходе Солнца, и начале и окончании сумерек

# date_sun_info

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

date_sun_info — Возвращает массив с информацией о закате и восходе Солнца, и начале и окончании сумерек

### Описание

function 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() - Возвращает время захода солнца для заданных дня и расположения

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open