Как сохранить время в UTC (GMT+0) на PHP

Допустим, нужно сохранить время в лог или json, но в человекочитаемом виде, чтобы впоследствии можно было его считать и использовать в скрипте. Можно было бы воспользоваться простым советским трёхкопеечным date('d.m.Y H:i:s'), но при переносе скрипта на сервер с отличной от исходной таймзоной, в момент, когда мы будем преобразовывать строку со временем назад к секундам, PHP воспримет строку как локальное время, и сместит ее к нему. По итогу время либо увеличится на эту разницу в часах, либо уменьшится.

Чтобы избежать таких недоразумений, для себя я выбрал вариант сохранять строку времени в часовом поясе UTC (оно же — GMT). Примерно так:

// получим человекочитаемую дату с указанием пояса
$date_human = gmdate('d.m.Y H:i:s P T', time());
echo $date_human; // 31.08.2025 10:42:34 +00:00 GMT

// считаем метку назад в секунды
$back_time = strtotime($date_human);
echo $back_time; // 1756636954

// альтернатива - через datetime, можем указать иной часовой пояс
$dtBack = new DateTime($date_human, new DateTimeZone("UTC"));
echo $dtBack->getTimestamp(); // 1756636954

gmdate() делает то же, что и date() — возвращает отформатированную по заданной строке формата строку с датой и временем, за исключением того, что преобразовывает время в гринвичское.

Здесь мы сначала получаем gmt/utc time, преобразовываем метку времени в строку по переданному формату с указанием часового пояса благодаря символам P (покажет разницу в часах) и T (отобразит имя часового пояса), а затем проведём обратную процедуру — через strtotime() преобразовываем нашу человекочитаемую строку с временем в метку времени Unix.

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Прокрутить вверх