Как перевести время в другой часовой пояс
Короткий ответ
Создайте дату в исходном поясе и вызовите setTimezone():
<?php
$utc = new DateTimeImmutable('2026-03-15 12:00', new DateTimeZone('UTC'));
echo $utc->setTimezone(new DateTimeZone('Europe/Paris'))->format('Y-m-d H:i'), "\n";
echo $utc->setTimezone(new DateTimeZone('Asia/Tokyo'))->format('Y-m-d H:i');Результат:
2026-03-15 13:00
2026-03-15 21:00Храните время в UTC
В базе данных время хранят в UTC, а в пояс пользователя переводят только при выводе. Момент времени при этом не меняется — меняется лишь его запись:
<?php
$utc = new DateTimeImmutable('2026-03-15 12:00', new DateTimeZone('UTC'));
$tokyo = $utc->setTimezone(new DateTimeZone('Asia/Tokyo'));
var_dump($utc == $tokyo);
var_dump($utc->getTimestamp() === $tokyo->getTimestamp());Результат:
bool(true)
bool(true)Функции из этого ответа
- DateTimeImmutable — Объект даты и времени, который нельзя изменить: каждое действие возвращает новый объект.
- date_default_timezone_set — Задаёт часовой пояс для всех функций даты.
- date — Форматирует дату и время.