timezone_open()
Функция timezone_open() — встроенная функция PHP, создающая новый объект DateTimeZone из идентификатора часового пояса.
Функция PHP timezone_open()
timezone_open() создаёт новый объект DateTimeZone из идентификатора часового пояса. Это процедурный псевдоним new DateTimeZone() — оба варианта делают ровно одно и то же, поэтому вы можете использовать тот стиль, который больше подходит вашей кодовой базе.
Сам по себе объект DateTimeZone ничего «не делает». Его задача — быть переданным объекту DateTime, чтобы временны́е метки интерпретировались и отображались в правильном часовом поясе. Именно это делает timezone_open() полезной: она позволяет одному скрипту корректно отображать один и тот же момент времени для пользователей в Нью-Йорке, Париже или Токио.
Синтаксис
timezone_open(string $timezone): DateTimeZone|falseПараметр
$timezone— один идентификатор часового пояса. Используйте полное имя IANA, например"America/New_York","Europe/Paris"или"UTC". Аббревиатуры вроде"EST"допустимы, но неоднозначны, поэтому лучше их избегать. Полный список можно получить с помощьюtimezone_identifiers_list().
Возвращаемое значение
- Объект
DateTimeZoneв случае успеха. false, если идентификатор не распознан (также генерируется предупреждениеWarning). По этой причине всегда проверяйте пользовательские идентификаторы перед их передачей в функцию.
Практические примеры
Пример 1: Установка часового пояса по умолчанию
timezone_open() не изменяет часовой пояс скрипта по умолчанию — это задача date_default_timezone_set(). Установите его один раз в начале скрипта, чтобы любой DateTime, созданный без явного пояса, использовал правильный:
<?php
date_default_timezone_set('America/New_York');
echo date_default_timezone_get(); // America/New_YorkПример 2: Создание DateTime с определённым часовым поясом
Передайте объект, возвращённый timezone_open(), вторым аргументом конструктору DateTime. Тогда 'now' будет интерпретироваться в этом поясе:
Символ P в конце формата выводит смещение UTC (например, +02:00), что позволяет убедиться в применении часового пояса.
Пример 3: Конвертация между часовыми поясами
DateTime всегда хранит абсолютный момент времени. Вызов setTimezone() не перемещает этот момент — он лишь изменяет способ его отображения. Здесь полдень в Нью-Йорке показан как соответствующее местное время в Париже:
Время увеличивается на шесть часов, потому что Париж в январе опережает Нью-Йорк на шесть часов.
Пример 4: Защита от недопустимого идентификатора
Поскольку timezone_open() возвращает false при ошибке, проверяйте результат перед использованием — особенно если идентификатор поступает от пользователя:
<?php
$tz = @timezone_open('Mars/Olympus_Mons');
if ($tz === false) {
echo 'Unknown timezone, falling back to UTC.';
$tz = timezone_open('UTC');
}
echo "\n", $tz->getName(); // UTCКогда использовать timezone_open()
- Отображение одного момента в нескольких часовых поясах — храните всё в UTC, а при выводе конвертируйте с помощью
setTimezone(). - Чтение смещения или имени пояса объекта
DateTimeчерезtimezone_name_get()илиtimezone_offset_get(). - Процедурные кодовые базы, предпочитающие вызовы
function()вместоnewдля единообразия.
Если вы пишете объектно-ориентированный PHP, запись new DateTimeZone('Europe/Paris') читается естественнее и ведёт себя идентично.
Заключение
timezone_open() создаёт объект DateTimeZone из идентификатора, чтобы значения DateTime интерпретировались и отображались в правильном часовом поясе. Ключевые моменты: функция взаимозаменяема с new DateTimeZone(), возвращает false при неверном идентификаторе (поэтому валидируйте входные данные), а setTimezone() изменяет только отображаемое время, но не сам момент времени. Для более широкого контекста см. PHP Timezones и PHP Date and Time.