Date sunset: примеры (PHP)

Примеры использования функции date_sunset для расчета заката
Раздел: Дата и время
date_sunset(int $timestamp, int $return_format = SUNFUNCS_RET_STRING, ?float $latitude = null, ?float $longitude = null, ?float $zenith = null, ?float $utc_offset = 0): mixed

Функция date_sunset в PHP

Назначение

Функция date_sunset() возвращает время заката солнца для указанной даты и местоположения. Она используется в приложениях, связанных с астрономией, фотографией, планированием мероприятий на открытом воздухе или для расчета продолжительности светового дня.

Аргументы функции

Сигнатура: date_sunset(int $timestamp, int $returnFormat = SUNFUNCS_RET_STRING, ?float $latitude = null, ?float $longitude = null, ?float $zenith = null, ?float $utcOffset = null): mixed

  1. timestamp - метка времени Unix, для которой рассчитывается закат.
  2. returnFormat - формат возвращаемого значения:
    • SUNFUNCS_RET_STRING - время в формате "ЧЧ:ММ" (строка).
    • SUNFUNCS_RET_DOUBLE - время как число с плавающей точкой (часы.дробная_часть).
    • SUNFUNCS_RET_TIMESTAMP - метка времени Unix.
  3. latitude - широта места (от -90 до 90). Если не указана, используется значение из php.ini (date.default_latitude).
  4. longitude - долгота места (от -180 до 180). Если не указана, используется значение из php.ini (date.default_longitude).
  5. zenith - зенит (угол между солнцем и вертикалью). Стандартные значения:
    • date.sunrise_zenith (90.833) - по умолчанию, учитывает атмосферную рефракцию.
    • 90 - геометрический закат (солнце на горизонте).
    • 96 - гражданские сумерки (вечерние).
    • 102 - навигационные сумерки.
    • 108 - астрономические сумерки.
  6. utcOffset - смещение от UTC в часах. Если не указано, используется локальный часовой пояс.

Примеры использования date_sunset

Базовый пример с параметрами по умолчанию

Рассчитывает время заката для текущей даты и местоположения, указанного в настройках PHP.

<?php
$timestamp = time();
echo date_sunset($timestamp);
?>
17:45
Использование различных форматов возврата

Возврат времени в разных форматах.

<?php
$timestamp = strtotime('2023-12-21');
echo date_sunset($timestamp, SUNFUNCS_RET_STRING, 55.7558, 37.6173) . "\n";
echo date_sunset($timestamp, SUNFUNCS_RET_DOUBLE, 55.7558, 37.6173) . "\n";
echo date_sunset($timestamp, SUNFUNCS_RET_TIMESTAMP, 55.7558, 37.6173) . "\n";
?>
15:58
15.966666666667
1703174280
Расчет времени заката с учетом сумерек

Определение времени наступления гражданских сумерек (зенит 96 градусов).

<?php
$timestamp = strtotime('2023-06-21');
$civilTwilight = date_sunset($timestamp, SUNFUNCS_RET_STRING, 59.9343, 30.3351, 96);
echo "Гражданские сумерки в Санкт-Петербурге 21 июня 2023: $civilTwilight";
?>
Гражданские сумерки в Санкт-Петербурге 21 июня 2023: 23:12
Использование смещения UTC

Расчет для местоположения с явным указанием смещения от UTC.

<?php
$timestamp = strtotime('2023-03-15');
echo date_sunset($timestamp, SUNFUNCS_RET_STRING, 40.7128, -74.0060, 90.833, -5);
?>
19:05

Похожие функции в PHP

Функция date_sunrise() имеет идентичную сигнатуру и возвращает время восхода солнца. Используется в тех же сценариях, что и date_sunset().

date_sun_info

Функция date_sun_info() возвращает массив с временами восхода, заката, транзита (зенита), а также начала и конца гражданских, навигационных и астрономических сумерек. Предпочтительнее при необходимости получения всех солнечных данных за один вызов.

<?php
$sun_info = date_sun_info(strtotime('2023-06-21'), 55.7558, 37.6173);
print_r($sun_info);
?>
Array
(
    [sunrise] => 1703174280
    [sunset] => 1703217600
    [transit] => 1703195940
    [civil_twilight_begin] => 1703172480
    [civil_twilight_end] => 1703219400
    [nautical_twilight_begin] => 1703170380
    [nautical_twilight_end] => 1703221500
    [astronomical_twilight_begin] => 1703168340
    [astronomical_twilight_end] => 1703223540
)

Типичные ошибки

Некорректные координаты

Передача широты или долготы вне допустимого диапазона приводит к ложному результату.

<?php
$timestamp = time();
$result = date_sunset($timestamp, SUNFUNCS_RET_STRING, 95, 200);
var_dump($result);
?>
bool(false)
Игнорирование смещения часового пояса

Неявное использование локального часового пояса может привести к несоответствию ожидаемого времени.

<?php
date_default_timezone_set('Europe/Moscow');
$timestamp = strtotime('2023-01-01');
// Без явного указания utcOffset, используется локальный пояс
echo date_sunset($timestamp, SUNFUNCS_RET_STRING, 55.7558, 37.6173);
?>
16:59

Изменения в PHP 8

Строгая типизация

В PHP 8 все параметры функции, кроме timestamp и returnFormat, допускают значение null. При передаче неверного типа аргумента выбрасывается TypeError.

Улучшения точности

Алгоритмы расчета были обновлены для повышения точности в экстремальных широтах и условиях.

Расширенные примеры

Расчет продолжительности светового дня

Разница между временем восхода и заката солнца.

Пример php
<?php
function daylight_duration($timestamp, $lat, $lon) {
    $sunrise = date_sunrise($timestamp, SUNFUNCS_RET_TIMESTAMP, $lat, $lon);
    $sunset = date_sunset($timestamp, SUNFUNCS_RET_TIMESTAMP, $lat, $lon);
    return $sunset - $sunrise;
}

$duration = daylight_duration(strtotime('2023-06-21'), 59.9343, 30.3351);
echo gmdate('H:i', $duration);
?>
18:50
Определение полярного дня и ночи

Проверка, происходит ли закат в указанный день в высоких широтах.

Пример php
<?php
function is_polar_night($timestamp, $lat, $lon) {
    $sunset = date_sunset($timestamp, SUNFUNCS_RET_STRING, $lat, $lon, 90.833);
    return $sunset === false;
}

$result = is_polar_night(strtotime('2023-12-21'), 78.2232, 15.6267); // Шпицберген
var_dump($result);
?>
bool(true)
Использование пользовательского зенита

Расчет времени, когда солнце опускается на определенный угол ниже горизонта.

Пример php
<?php
$timestamp = strtotime('2023-09-23');
$customZenith = 95; // Солнце на 5 градусов ниже горизонта
$time = date_sunset($timestamp, SUNFUNCS_RET_STRING, 45.0, 10.0, $customZenith);
echo $time;
?>
19:30
Пакетный расчет для нескольких дат

Расчет времени заката для диапазона дат.

Пример php
<?php
$lat = 55.7558;
$lon = 37.6173;
$dates = ['2023-01-01', '2023-03-01', '2023-06-01'];

foreach ($dates as $date) {
    $timestamp = strtotime($date);
    $sunset = date_sunset($timestamp, SUNFUNCS_RET_STRING, $lat, $lon);
    echo "$date: $sunset<br>";
}
?>
2023-01-01: 16:59
2023-03-01: 18:45
2023-06-01: 21:03

Альтернативы в других языках

Python: astral

Библиотека Astral предоставляет более точные расчеты с учетом атмосферной рефракции.

from astral import LocationInfo
from astral.sun import sunset
from datetime import date

city = LocationInfo("Moscow", "Russia", "Europe/Moscow", 55.7558, 37.6173)
s = sunset(city.observer, date=date(2023, 6, 21))
print(s)
2023-06-21 21:18:00+03:00
JavaScript: SunCalc

Библиотека SunCalc для JavaScript рассчитывает солнечные позиции и фазы.

const SunCalc = require('suncalc');
const sunset = SunCalc.getTimes(new Date('2023-06-21'), 55.7558, 37.6173).sunset;
console.log(sunset);
2023-06-21T18:18:00.000Z
MySQL: SUNSET

Встроенная функция не предусмотрена, но можно использовать пользовательские функции или внешние данные.

PHP date_sunset function comments

En
Date sunset Returns time of sunset for a given day and location