Avatar ·

Ошибка "It is not safe to rely on the system's timezone settings" в PHP: как исправить?

Всем привет! Я только начал изучать PHP и столкнулся с непонятной ошибкой при попытке вывести текущую дату. Пишу простой скрипт: ```php ``` Но вместо даты получаю предупреждение: ``` Warning: date(): 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 the timezone 'UTC' for now, but please set date.timezone to select your timezone. ``` Я работаю на локальном сервере OpenServer, PHP версии 8.2. Пробовал гуглить, но советы разнятся: кто-то говорит править php.ini, кто-то — добавлять функцию в код. Подскажите, как правильно настроить часовой пояс? Где вообще хранятся эти настройки и какой часовой пояс выбрать для Москвы? Заранее спасибо! P.S. Если можно, объясните "на пальцах", что такое timezone и зачем он вообще нужен при работе с датами. <<>>

Что такое timezone и почему возникает ошибка?

Часовой пояс (timezone) — это регион с одинаковым стандартным временем. PHP требует явно указать часовой пояс, потому что от него зависит корректность всех операций с датами: date(), strtotime(), DateTime и других. Без настройки PHP не знает, в каком времени вы работаете, и выдаёт предупреждение.

Есть два способа исправить ошибку. Рекомендую использовать оба, но основной — первый.

Способ 1: Установка через функцию date_default_timezone_set() (в коде)

Самый простой и надёжный метод — добавить одну строку в начало вашего скрипта (после <?php):

<?php
date_default_timezone_set('Europe/Moscow');
echo date("Y-m-d H:i:s");
?>

Для других городов России используйте:

  • Москва, Санкт-Петербург — Europe/Moscow
  • Калининград — Europe/Kaliningrad
  • Самара — Europe/Samara
  • Екатеринбург — Asia/Yekaterinburg
  • Новосибирск, Омск — Asia/Novosibirsk
  • Красноярск — Asia/Krasnoyarsk
  • Иркутск — Asia/Irkutsk
  • Владивосток, Хабаровск — Asia/Vladivostok
  • Камчатка — Asia/Kamchatka

Преимущество этого метода — настройка действует только для текущего скрипта и не влияет на другие проекты на сервере.

Способ 2: Глобальная настройка в php.ini (для всего сервера)

Если вы хотите задать часовой пояс для всех скриптов сразу, отредактируйте файл php.ini. В OpenServer он находится в папке userdata/config/ (для каждой версии PHP свой). Найдите строку:

;date.timezone =

Раскомментируйте её (уберите точку с запятой) и укажите значение:

date.timezone = Europe/Moscow

После этого перезапустите веб-сервер (в OpenServer — кнопка "Перезапустить").

Как проверить, что всё работает?

Напишите простой тест:

<?php
echo date_default_timezone_get(); // выведет "Europe/Moscow"
echo "<br>";
echo date("Y-m-d H:i:s");
?>

Если видите корректное московское время — всё настроено правильно.

Важное замечание

Если вы используете PHP-фреймворки (Laravel, Symfony, WordPress), у них обычно есть свои настройки часового пояса в конфигурационных файлах. Например, в Laravel это config/app.php → параметр 'timezone'. Но базовая настройка через php.ini или date_default_timezone_set() всё равно требуется, чтобы избежать предупреждения.

<<>>

Альтернативный подход: использование класса DateTime

Вместо функции date() рекомендую сразу привыкать к объектно-ориентированному подходу с классом DateTime. Он более гибкий и позволяет явно указывать часовой пояс при создании объекта, что решает проблему без глобальных настроек:

<?php
$date = new DateTime('now', new DateTimeZone('Europe/Moscow'));
echo $date->format('Y-m-d H:i:s');
?>

Если вам нужно получить текущее время в UTC:

<?php
$utcDate = new DateTime('now', new DateTimeZone('UTC'));
echo $utcDate->format('Y-m-d H:i:s');
?>

Этот метод особенно полезен, когда в одном скрипте нужно работать с разными часовыми поясами — например, показывать время для пользователей из разных регионов. Вы просто создаёте отдельные объекты DateTime с нужными DateTimeZone.

Кстати, полный список поддерживаемых часовых поясов можно получить командой:

<?php
print_r(DateTimeZone::listIdentifiers());
?>

Это выведет массив из сотен доступных идентификаторов, включая все регионы России.