PHP на сервере PHP 7.x/8.x на Linux; версия и веб-обработчик уточняются

PHP на сервере: Неверный часовой пояс PHP приводит к неправильным датам

  • Обновлено
  • Чтение ≈ 3 минуты

Краткий ответ

При записи и выводе времени PHP может использовать не тот часовой пояс, что пользователь или сервер. Важно сравнить фактический момент времени, часовой пояс PHP, БД и настройки приложения: перестановка часов в интерфейсе не обязательно означает неверное системное время.

В этой статье
  1. Что происходит и как определить неисправность
  2. Вероятные причины и признаки
  3. Пошаговая диагностика и исправление
  4. Как проверить результат
  5. Если не помогло

#Что происходит и как определить неисправность

При записи и выводе времени PHP может использовать не тот часовой пояс, что пользователь или сервер. Важно сравнить фактический момент времени, часовой пояс PHP, БД и настройки приложения: перестановка часов в интерфейсе не обязательно означает неверное системное время.

#Вероятные причины и признаки

Возможная причинаКак узнатьЧто делать
В PHP выбран UTC или зона другого регионаВ PHP выбран UTC или зона другого региона. date_default_timezone_get() возвращает не ожидаемую зону; серверное время при этом правильноеdate_default_timezone_get() возвращает не ожидаемую зону; серверное время при этом правильноеНастроить date.timezone у соответствующего веб-пула.
Приложение самостоятельно выбирает зонуПриложение самостоятельно выбирает зону. Значение ini корректно, но даты после загрузки приложения сдвинутыЗначение ini корректно, но даты после загрузки приложения сдвинутыПроверить date_default_timezone_set и преобразования DateTime.
База или клиент интерпретирует дату в другой зонеБаза или клиент интерпретирует дату в другой зоне. UTC в базе верен, сдвиг происходит только при показе пользователюUTC в базе верен, сдвиг происходит только при показе пользователюРазделить хранение UTC и вывод пользовательской зоны.

#Пошаговая диагностика и исправление

  1. Зафиксируйте пример без изменения данныхОткройте страницу с неверной датой, запишите значение, имя пользователя, дату запроса и ожидаемую часовую зону. Сравните дату в журнале и время на телефоне с синхронизацией. Учтите переход летнего времени: ручное добавление постоянных трёх часов может оказаться неверным.
  1. Проверьте системные часы LinuxПодключитесь к серверу по SSH под учётной записью с доступом на чтение. Выполните команду и посмотрите Local time, Universal time и Time zone. Если часы не синхронизированы, передавайте диагностику администратору; не подменяйте зону PHP исправлением системного времени.
  2. Только просмотр; systemd-системы Linux
    Linux · Терминал (Bash)Команда
    Только просмотр; systemd-системы Linux.
    timedatectl status
  1. Уточните зону командной строки, но не переносите вывод на сайтЗапустите PHP в SSH и запишите результат. CLI читает свои файлы настройки, а сайт с PHP-FPM может читать другие: совпадение или отличие здесь только подсказывает направление поиска.
  2. Команда для PHP CLI, не доказывает настройки веб-пула
    Linux · Терминал (Bash)Команда
    Команда для PHP CLI, не доказывает настройки веб-пула.
    php -r 'echo date_default_timezone_get(), PHP_EOL; echo date("c"), PHP_EOL;'
  1. Измерьте зону именно веб-запросаВ непубличном служебном файле временно выведите date_default_timezone_get() и date("c"); доступ ограничьте по IP/авторизации. Откройте файл через HTTPS и сравните с CLI. Сразу удалите диагностический файл. Не выкладывайте phpinfo() публично.
  1. Найдите активную настройку сайтаВ панели хостинга откройте настройки PHP выбранного домена или нужный пул PHP-FPM. Найдите параметр date.timezone. Если он пуст или не соответствует нужной зоне, укажите IANA-идентификатор, например Europe/Tallinn, без сокращения EET; сначала сохраните копию изменяемого конфигурационного файла.
  1. Примените настройку к нужному процессуПроверьте конфигурацию PHP-FPM на тестовом сайте и используйте предусмотренное панелью действие «Применить». При прямом управлении systemd выясните название службы, например php8.2-fpm; не перезапускайте наугад другие сайты. После применения повторите веб-проверку и удалите диагностический код.
  1. Проверьте настройки приложения и базыЕсли PHP показывает правильную зону, найдите в исходном коде date_default_timezone_set и создание DateTime с явной зоной. Для БД проверьте способ хранения: UTC-время и смещение в локальном интерфейсе могут быть запланированы. Исправляйте преобразование при выводе, а не массово обновляйте даты в таблице.
  1. Проверьте переход на летнее и зимнее времяНа тестовой копии выведите два заранее выбранных момента до и после смены часов. Для будущих дат используйте именованную зону и DateTimeZone, а не фиксированное смещение. Сравните итоговые даты в записях и письмах; если они расходятся, откатите конфигурацию и исследуйте приложение.

#Как проверить результат

Снова откройте проблемную страницу после обновления данных, сравните два контрольных момента и журналы. PHP веб-запроса должен показывать выбранный идентификатор зоны; одновременный сдвиг сохраняемого времени без изменения отображения — повод остановить правку.

#Если не помогло

Если настройки PHP верны, а дата смещена только у части пользователей, проверьте зону профиля и браузера. Если дата смещена у всех, сравните серверное, SQL и прикладное преобразования отдельно; не правьте хранимые записи без копии.

Так эту ошибку тоже называют

Источники и обновления

Последнее обновление статьи: 2 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.