W3docs

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' будет интерпретироваться в этом поясе:

php— editable, runs on the server

Символ P в конце формата выводит смещение UTC (например, +02:00), что позволяет убедиться в применении часового пояса.

Пример 3: Конвертация между часовыми поясами

DateTime всегда хранит абсолютный момент времени. Вызов setTimezone() не перемещает этот момент — он лишь изменяет способ его отображения. Здесь полдень в Нью-Йорке показан как соответствующее местное время в Париже:

php— editable, runs on the server

Время увеличивается на шесть часов, потому что Париж в январе опережает Нью-Йорк на шесть часов.

Пример 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.

Практика

Практика
Что можно сказать о классе 'DateTimeZone' в PHP?
Что можно сказать о классе 'DateTimeZone' в PHP?
Was this page helpful?