W3docs

date_default_timezone_set()

Как использовать date_default_timezone_set() в PHP для управления часовым поясом всех функций даты/времени в скрипте, с примерами.

Введение

Функция date_default_timezone_set() устанавливает часовой пояс по умолчанию, используемый всеми функциями даты/времени в PHP-скрипте. После её вызова такие функции, как date(), mktime(), strtotime() и DateTime, интерпретируют и форматируют время относительно этого часового пояса. На этой странице объясняется, что делает функция, когда она нужна и каких подводных камней следует избегать.

Синтаксис

date_default_timezone_set(string $timezoneId): bool

$timezoneId — это string-идентификатор часового пояса из базы данных IANA, например Europe/London или Asia/Tokyo, а не аббревиатура вроде EST. Функция возвращает true при успехе и false, если идентификатор недействителен. При недействительном идентификаторе PHP также генерирует E_WARNING и возвращается к ранее настроенному часовому поясу.

Почему это важно

Метка времени — это просто количество секунд с начала эпохи Unix (UTC). Чтобы превратить это число в читаемую дату — «2024-03-15 14:30» — PHP необходимо знать, в каком часовом поясе её отображать. Если вы не укажете его, PHP использует значение date.timezone из php.ini, которое может различаться на локальной машине, стейджинге и продакшене. Это классический источник ошибок вида «время отличается на несколько часов».

Вызов date_default_timezone_set() в начале скрипта делает часовой пояс явным и единообразным везде, где выполняется ваш код, независимо от конфигурации сервера.

Базовое использование

<?php
date_default_timezone_set('America/New_York');

echo date('Y-m-d H:i:s');

Это устанавливает часовой пояс скрипта на Восточное время США. Все последующие вызовы функций даты/времени будут отображать время в этом часовом поясе. Установка пояса не изменяет саму метку времени — только способ её отображения.

Смена часового пояса во время выполнения

Вы можете менять часовой пояс по умолчанию несколько раз. Одна и та же метка времени Unix отображает разное местное время в каждом поясе:

php— editable, runs on the server

Здесь date_default_timezone_get() подтверждает текущий активный часовой пояс — удобно при отладке.

Обработка недействительного идентификатора

Поскольку функция возвращает false (и генерирует предупреждение) при неверном идентификаторе, проверяйте возвращаемое значение, когда пояс берётся из пользовательского ввода или конфигурации:

<?php
$zone = 'Mars/Olympus_Mons'; // not a real timezone

if (@date_default_timezone_set($zone)) {
    echo "Timezone set to $zone\n";
} else {
    date_default_timezone_set('UTC');
    echo "Invalid timezone, falling back to UTC\n";
}
// Outputs: Invalid timezone, falling back to UTC

Часто используемые идентификаторы

PHP поддерживает сотни часовых поясов. Несколько наиболее употребительных:

РегионИдентификатор
Нью-ЙоркAmerica/New_York
ЧикагоAmerica/Chicago
Лос-АнджелесAmerica/Los_Angeles
ЛондонEurope/London
ПарижEurope/Paris
ТокиоAsia/Tokyo
СиднейAustralia/Sydney
Всемирное координированное времяUTC

Для получения полного, автоматически сгенерированного списка используйте timezone_identifiers_list(), а обзор смотрите в справочнике PHP timezones.

Рекомендации

  • Устанавливайте один раз, в начале. Вызывайте функцию в начале загрузочного/входного файла, чтобы весь запрос использовал единый часовой пояс.
  • Предпочитайте хранение в UTC. Сохраняйте метки времени в UTC в базе данных и конвертируйте в пояс пользователя только для отображения — это устраняет неоднозначность вокруг летнего времени.
  • Используйте идентификаторы, а не аббревиатуры. Europe/London автоматически учитывает летнее время (DST), тогда как GMT/BST — нет.

Заключение

date_default_timezone_set() даёт вам явный контроль над тем, как PHP отображает даты и время, обеспечивая единообразное поведение во всех средах. Устанавливайте часовой пояс осознанно, проверяйте ненадёжные идентификаторы и уточняйте текущий пояс с помощью date_default_timezone_get(), если что-то выглядит не так.

Практика

Практика
Какова роль функции 'date_default_timezone_set()' в PHP?
Какова роль функции 'date_default_timezone_set()' в PHP?
Was this page helpful?