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 отображает разное местное время в каждом поясе:
Здесь 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(), если что-то выглядит не так.