date_sunset()
Узнайте, как работала date_sunset() в PHP 7.x, почему её удалили в PHP 8.1 и как получать время заката в современном PHP.
Введение
date_sunset() — устаревшая функция PHP, которая возвращает время заката для заданной даты и географического местоположения. На этой странице объясняется, что она возвращала, как работали её параметры, почему она была удалена из современного PHP и чем её заменить. Если вы пишете новый код, переходите сразу к разделу Переход на современный PHP — но понимание оригинальной сигнатуры по-прежнему полезно при поддержке старых кодовых баз.
date_sunset() была признана устаревшей в PHP 8.0 и удалена в PHP 8.1. На любой современной версии PHP она вызовет ошибку Error («Call to undefined function»). Используйте её только при поддержке кода на PHP 7.x; для нового кода вместо неё применяйте библиотеку или внешний API.
Что делает date_sunset()
date_sunset() вычисляла момент, когда солнце опускается за горизонт для конкретной даты и конкретной точки на Земле. Функции требовалось четыре элемента:
- Дата, передаваемая в виде Unix-временной метки.
- Широта и долгота, определяющие положение наблюдателя.
- Угол зенита — угол, измеренный от вертикали вниз, при котором солнце считается «зашедшим». Значение по умолчанию
90.83°чуть больше прямого угла, так как компенсирует атмосферную рефракцию (которая изгибает солнечный свет и делает солнце видимым выше его реального положения) и видимый радиус солнечного диска.
По умолчанию функция возвращала строку вида "18:12", но с соответствующим флагом она могла возвращать результат как Unix-временную метку, которую затем можно форматировать с помощью date() или преобразовывать любой другой функцией работы с датами.
Синтаксис
date_sunset(
int $timestamp,
int $returnFormat = SUNFUNCS_RET_STRING,
float $latitude = ini_get("date.default_latitude"),
float $longitude = ini_get("date.default_longitude"),
float $zenith = ini_get("date.sunset_zenith"),
float $utcOffset = 0
): mixedПараметры
- timestamp — Unix-временная метка дня, для которого рассчитывается закат. Используйте
strtotime()илиmktime(). - returnFormat — Одна из трёх констант, определяющих тип возвращаемого значения:
SUNFUNCS_RET_STRING— string вида"HH:MM"(по умолчанию).SUNFUNCS_RET_DOUBLE— время в часах от полуночи (число с плавающей точкой, например18.2).SUNFUNCS_RET_TIMESTAMP— Unix-временная метка.
- latitude — Широта наблюдателя в градусах (положительная = север).
- longitude — Долгота наблюдателя в градусах (положительная = восток, отрицательная = запад).
- zenith — Угол зенита солнца на закате; по умолчанию
90.83°. - utcOffset — Смещение от UTC в часах; игнорируется, когда
returnFormatвозвращает временную метку.
Функция возвращала false для местоположений и дат, где солнце не заходит или не восходит (например, на полюсах летом или зимой).
Пример (устаревший PHP 7.x)
Следующий код работает на PHP 7.x и более ранних версиях, где функция ещё существует:
Вывод:
Sunset on March 3, 2023 in San Francisco was at 18:12Поскольку результат является временной меткой, его можно форматировать по-разному — например, date("g:i A", $sunset) выведет 6:12 PM.
Переход на современный PHP
date_sunset() больше не существует, а встроенный класс PHP DateTime управляет часовыми поясами и форматированием, но не вычисляет положение солнца. Поэтому в современном приложении есть два практических варианта.
Вариант 1 — Обращение к API восхода/заката
Самый простой переносимый подход — запросить публичный сервис и считать возвращаемую им временную метку. Это работает на любой версии PHP и не требует математических вычислений на вашей стороне:
<?php
// Free, no-key API: https://sunrise-sunset.org/api
$lat = 37.7749;
$lng = -122.4194;
$date = '2023-03-03';
$url = "https://api.sunrise-sunset.org/json?lat={$lat}&lng={$lng}&date={$date}&formatted=0";
$response = json_decode(file_get_contents($url), true);
// The API returns ISO-8601 UTC strings
$sunsetUtc = new DateTime($response['results']['sunset']);
$sunsetUtc->setTimezone(new DateTimeZone('America/Los_Angeles'));
echo "Sunset: " . $sunsetUtc->format('H:i');
?>Вариант 2 — Использование астрономической библиотеки
Для автономного вычисления без подключения к интернету установите поддерживаемый Composer-пакет, реализующий тот же алгоритм расчёта заката (ищите на Packagist по запросу «sunrise sunset»; популярные варианты — tienvx/php-sunrise-sunset и andreas-glaser/php-sun-info). Конкретные имена классов зависят от пакета, поэтому всегда проверяйте его README — общая схема такова: создайте объект-вычислитель на основе широты и долготы, затем запросите время заката для нужной даты.
Где применяется время заката
Независимо от того, используете ли вы date_sunset() (устаревший вариант) или одну из современных альтернатив выше, данные о закате применяются во многих типах приложений:
- Погодные приложения — отображают время заката вместе с прогнозом погоды для местоположения.
- Приложения для фотографии — вычисляют «золотой час» — период незадолго до заката, когда свет мягкий и тёплый — путём вычитания часа от времени заката.
- Приложения для мероприятий и планирования — отмечают открытые мероприятия, продолжающиеся до темноты, или переключают оформление сайта на тёмное после наступления сумерек.
- Умный дом и освещение — включают свет или запускают сценарии в момент местного заката.
Сочетайте время заката с date_sunrise(), чтобы получить полный световой день для любого местоположения.
Заключение
date_sunset() была удобным способом получить время заката в PHP 7.x одним вызовом, но она была удалена в PHP 8.1 и не работает ни на одной современной версии PHP. Для нового кода обращайтесь к API восхода/заката или используйте поддерживаемую астрономическую библиотеку, а результат форматируйте с помощью класса DateTime. Сценарии использования — погода, фотография, мероприятия, автоматизация — остались прежними; изменился лишь источник вычислений, который переехал за пределы ядра PHP.