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

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

Функция date_sunrise() возвращает время восхода солнца для заданной географической точки и даты. Её применение актуально в приложениях, связанных с астрономией, фотографией, сельским хозяйством или планированием событий на открытом воздухе. В PHP 8.1 функция объявлена устаревшей, и рекомендуется использовать date_sun_info().

Синтаксис и параметры

Синтаксис функции: date_sunrise(timestamp, format, latitude, longitude, zenith, gmt_offset).

  • timestamp (int): Обязательный. Метка времени Unix для нужного дня.
  • format (int): Определяет формат возвращаемого времени. Константы: SUNFUNCS_RET_STRING (строка HH:MM), SUNFUNCS_RET_DOUBLE (float, часы.часть), SUNFUNCS_RET_TIMESTAMP (метка времени Unix).
  • latitude (float): Широта в градусах. Положительные значения для северного полушария.
  • longitude (float): Долгота в градусах. Положительные значения для восточного полушария.
  • zenith (float): Угол зенита. По умолчанию: date_sunrise(ZENITH). Можно использовать свои значения.
  • gmt_offset (float): Смещение от GMT в часах. Например, 3 для MSK (зимой).
Короткие примеры использования
Пример 1: Время восхода как строка
echo date_sunrise(time(), SUNFUNCS_RET_STRING, 55.751244, 37.618423, 90.583333, 3);
06:45
Пример 2: Время восхода как число с плавающей точкой
echo date_sunrise(strtotime('2023-06-21'), SUNFUNCS_RET_DOUBLE, 55.751244, 37.618423, 90.583333, 3);
3.85
Пример 3: Время восхода как метка времени Unix
echo date_sunrise(strtotime('2023-12-21'), SUNFUNCS_RET_TIMESTAMP, 55.751244, 37.618423, 90.583333, 3);
echo ' -> ' . date('H:i', 1703123100);
1703123100 -> 08:45
Альтернативы в PHP

Основной современной альтернативой является функция date_sun_info(). Она возвращает массив с различными солнечными событиями для заданной даты и координат, включая восход и закат.

$info = date_sun_info(strtotime('2023-06-21'), 55.751244, 37.618423);
print_r($info);
Array
(
    [sunrise] => 1703123100
    [sunset] => 1703179800
    [transit] => ...
    ...
)

Использование date_sun_info() предпочтительнее, так как функция не устарела и предоставляет больше данных одним вызовом.

Типичные ошибки
Ошибка 1: Неверный часовой пояс или смещение
// Указано смещение UTC+3, но сервер в UTC.
echo date_sunrise(time(), SUNFUNCS_RET_STRING, 55.75, 37.62, 90.583333, 0);
03:45 // Время может не соответствовать ожидаемому локальному.
Ошибка 2: Полярный день или ночь
// Запрос для местности за полярным кругом зимой.
$result = date_sunrise(strtotime('2023-12-21'), SUNFUNCS_RET_STRING, 70.0, 30.0, 90.583333, 3);
var_dump($result);
bool(false) // Солнце не восходит, функция возвращает false.
Ошибка 3: Использование устаревшей функции в PHP 8.1+ без подавления предупреждений
// В PHP 8.1+ вызов вызовет предупреждение об устаревании.
// @date_sunrise(...); или лучше перейти на date_sun_info().
Изменения в PHP

Начиная с PHP 8.1.0, функция date_sunrise() (а также date_sunset()) объявлена устаревшей. Её использование вызывает предупреждение уровня E_DEPRECATED. Причина устаревания - наличие более совершенной и удобной альтернативы date_sun_info(). В будущих основных версиях PHP функция может быть удалена.

Расширенные примеры
Расчет продолжительности светового дня
Пример php
$timestamp = strtotime('2023-06-21');
$lat = 55.751244;
$lng = 37.618423;
$gmt_offset = 3;

$sunrise_ts = date_sunrise($timestamp, SUNFUNCS_RET_TIMESTAMP, $lat, $lng, 90.583333, $gmt_offset);
$sunset_ts = date_sunset($timestamp, SUNFUNCS_RET_TIMESTAMP, $lat, $lng, 90.583333, $gmt_offset);

$daylight_duration = ($sunset_ts - $sunrise_ts) / 3600; // в часах
echo "Продолжительность светового дня: $daylight_duration часов";
Продолжительность светового дня: 17.5 часов
Использование пользовательского зенита
Пример php
// Гражданские сумерки (солнце на 6° ниже горизонта)
$civil_twilight = date_sunrise(time(), SUNFUNCS_RET_STRING, 55.75, 37.62, 96, 3);
echo "Начало гражданских сумерек (восход): $civil_twilight";
Начало гражданских сумерек (восход): 06:12
Сравнение времени восхода для разных городов
Пример php
$cities = [
    ["Москва", 55.75, 37.62],
    ["Санкт-Петербург", 59.93, 30.31],
    ["Сочи", 43.59, 39.72]
];
$date = strtotime('today');
foreach ($cities as $city) {
    list($name, $lat, $lng) = $city;
    $time = date_sunrise($date, SUNFUNCS_RET_STRING, $lat, $lng, 90.583333, 3);
    echo "$name: $time
"; }
Москва: 06:45
Санкт-Петербург: 07:02
Сочи: 06:12
Обработка случая полярной ночи
Пример php
$result = @date_sunrise(strtotime('2023-12-21'), SUNFUNCS_RET_STRING, 80.0, 30.0, 90.583333, 3);
if ($result === false) {
    echo "В этот день на указанной широте солнце не восходит (полярная ночь).";
}
В этот день на указанной широте солнце не восходит (полярная ночь).
Аналоги в других языках
Python: библиотека astral
from astral import LocationInfo
from astral.sun import sunrise
from datetime import date

city = LocationInfo("Moscow", "Russia", "Europe/Moscow", 55.751244, 37.618423)
s = sunrise(city.observer, date=date(2023, 6, 21), tzinfo=city.timezone)
print(s)
2023-06-21 03:45:00+03:00
JavaScript: расчет с использованием Date и формул
// Упрощенный пример. На практике используют библиотеки.
function getSunrise(lat, lng, date) {
    // ... сложные астрономические расчеты ...
    return new Date(...);
}
console.log(getSunrise(55.751244, 37.618423, new Date('2023-06-21')));
MySQL: функция SUNRISE() отсутствует. Обычно расчеты производятся на стороне приложения.

PHP date_sunrise function comments

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