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