Warning: date(): It is not safe to rely on the system’s timezone settings — как исправить в PHP 5.3

Раздел: Серверы и сайты
Написано: 10.04.2010
Автор: Antonio

Развернул новый сервер, на нём встал PHP 5.3.2 с по-новому оформленным php.ini. И сразу на сайтах полезли предупреждения:

Warning: getdate(): It is not safe to rely on the system's
timezone settings. You are *required* to use the date.timezone
setting or the date_default_timezone_set() function. In case you
used any of those methods and you are still getting this warning,
you most likely misspelled the timezone identifier. We selected
'Europe/Helsinki' for 'EEST/3.0/DST' instead in ...

Warning: date() в PHP 5.3 — исправляем date.timezone в php.ini

Такое же предупреждение выдают и date(), mktime(), strtotime(): в старом виде оно выглядит как Warning: date() [function.date]: It is not safe to rely on the system’s timezone settings. Причина одна: начиная с PHP 5.3 часовой пояс нужно указать явно. Исправляется за минуту — ниже три способа.

Почему появляется предупреждение

Если часовой пояс нигде не задан, PHP 5.3 пытается угадать его по системным настройкам сервера (в моём случае выбрал Europe/Helsinki) и при каждом вызове функции даты напоминает об этом предупреждением. Скрипты работают, но предупреждения портят страницы, а время может оказаться не тем, что нужно.

Способ 1: php.ini (лучший)

Открываем php.ini и находим раздел [Date]. Там есть закомментированная строка ;date.timezone = — убираем точку с запятой и вписываем свой пояс:

[Date]
date.timezone = Europe/Kiev

Для Москвы — Europe/Moscow, остальные зоны есть в списке часовых поясов PHP.

Где лежит php.ini:

  • FreeBSD — /usr/local/etc/php.ini. Если файла нет, его делают из образца php.ini-production из того же каталога.
  • Debian и Ubuntu — /etc/php5/apache2/php.ini для веб-сервера и /etc/php5/cli/php.ini для консоли. Пояс нужно прописать в оба.

Точно узнать, какой файл читает PHP, можно командой php --ini (для консоли) или в выводе phpinfo() — строка «Loaded Configuration File».

После правки перезапускаем веб-сервер:

# FreeBSD
/usr/local/etc/rc.d/apache22 restart
# Debian, Ubuntu
/etc/init.d/apache2 restart

Проверка:

php -i | grep date.timezone

Способ 2: в самом скрипте

Если доступа к php.ini нет (обычный хостинг), пояс можно задать в начале скрипта, до первого вызова функций даты — например, в общем конфигурационном файле сайта:

<?php
date_default_timezone_set('Europe/Kiev');

Если «не помогло» — проверьте кавычки. При копировании со страниц прямые кавычки ' часто превращаются в «умные» ‘ ’, а с ними PHP строку не понимает. И строка должна выполняться раньше, чем код, который выдаёт предупреждение.

Способ 3: .htaccess или .user.ini

Если PHP работает как модуль Apache, пояс можно задать в файле .htaccess в корне сайта:

php_value date.timezone "Europe/Kiev"

Если же PHP запущен через CGI/FastCGI, эта строка вызовет ошибку 500. Тогда вместо неё создаём в корне сайта файл .user.ini:

date.timezone = Europe/Kiev

Дополнение (2026)

  • В PHP 7 это предупреждение убрали: если пояс не задан, PHP молча использует UTC. Ошибки на экране нет, но время может отличаться от вашего на 2–3 часа, поэтому date.timezone всё равно стоит указать.
  • Правильное название пояса для Украины теперь Europe/Kyiv. Старое Europe/Kiev оставлено только для совместимости, и PHP не рекомендует его использовать.

Коротко

  • Предупреждение «It is not safe to rely on the system’s timezone settings» значит, что в PHP не задан часовой пояс.
  • Лучшее решение — date.timezone в разделе [Date] файла php.ini и перезапуск веб-сервера.
  • Без доступа к php.ini — date_default_timezone_set() в скрипте, php_value в .htaccess (модуль Apache) или .user.ini (CGI/FastCGI).
Ещё похожие заметки:

1 Comment

serforall
Сен 4, 2012 22:12

Что-то не помогло «date_default_timezone_set(‘Europe/Kiev’);» *SORRY*

 

Написать

Копирование информации с сайта возможно только с указанием прямой ссылки - https://nemcd.com