Преобразование UTC-дате в локальное время в PHP
Проблема с конвертацией UTC даты в локальное время
Я сохраняю даты в формате UTC в базе данных с помощью следующего кода:
$utc = gmdate("M d Y h:i:s A");
Теперь мне нужно конвертировать сохраненную дату в формате UTC в локальное время клиента.
Как я могу это сделать?
Спасибо!
5 ответ(ов)
Если вы используете функцию strtotime
в PHP, она правильно интерпретирует коды часовых поясов, например UTC. Если вы получаете дату из базы данных или клиента без указания часового пояса, но знаете, что эта дата в UTC, вы можете просто добавить к строке указание часового пояса.
Допустим, вы получаете дату с кодом временной метки (например, "Fri Mar 23 2012 22:23:03 GMT-0700 (PDT)", что возвращает код JavaScript ""+(new Date())
):
$time = strtotime($dateWithTimeZone);
$dateInLocal = date("Y-m-d H:i:s", $time);
Если же вы не получаете часовой пояс, что вполне вероятно для MySQL, вы можете сделать следующее:
$time = strtotime($dateInUTC . ' UTC');
$dateInLocal = date("Y-m-d H:i:s", $time);
Таким образом, вы можете правильно обработать дату в UTC и преобразовать ее в локальное время.
Вы можете использовать следующий код для преобразования UTC-метки времени в индийское время (IST):
// создаем объект $utc с часовым поясом UTC
$IST = new DateTime('2016-12-12 12:12:12', new DateTimeZone('UTC'));
// изменяем часовой пояс объекта, не меняя его время
$IST->setTimezone(new DateTimeZone('Asia/Kolkata'));
// форматируем дату и время
echo $IST->format('Y-m-d H:i:s T');
Этот скрипт создает объект DateTime
, устанавливает его в часовом поясе UTC и затем меняет часовой пояс на 'Asia/Kolkata', что соответствует индийскому времени. После этого дата и время выводятся в формате ГГГГ-ММ-ДД ЧЧ:ММ:СС ЧЧ
(например, 2016-12-12 17:42:12 IST, в зависимости от времени).
В вашем коде нет необходимости в арифметике дат, если вам просто нужно отобразить одно и то же время в разных часовых поясах. Правильный подход заключается в использовании функции gmdate()
для получения метки времени в формате UTC, а затем переключении часовых поясов с помощью date_default_timezone_set()
. Вот ваш код с некоторыми комментариями:
// Задаем формат даты
$format = "M d, Y h:ia";
// Получаем текущую метку времени в UTC
$timestamp = gmdate($format);
// Устанавливаем часовой пояс UTC и форматируем дату
date_default_timezone_set("UTC");
$utc_datetime = date($format, $timestamp);
// Устанавливаем часовой пояс для Гуаякиля и форматируем дату
date_default_timezone_set("America/Guayaquil");
$local_datetime = date($format, $timestamp);
Важно помнить, что gmdate()
возвращает дату в формате UTC, и в результате вы можете получить одинаковую метку времени, независимо от установленного часового пояса. Таким образом, вы просто изменяете его отображение в зависимости от часовой зоны, что позволяет достичь желаемого результата без необходимости выполнять сложные вычисления.
date()
и localtime()
используют локальный часовой пояс сервера, если не переопределены; вы можете изменить используемый часовой пояс с помощью функции date_default_timezone_set()
.
Дополнительные сведения можно найти в официальной документации:
Чтобы получить локальное время на основе времени в формате UTC, выполните следующие шаги:
Сначала получите дату в формате UTC. Вы уже выполнили этот шаг, так что здесь вам просто нужно сделать запрос к базе данных:
$timezone = "UTC";
date_default_timezone_set($timezone);
$utc = gmdate("M d Y h:i:s A");
print "UTC: " . date('r', strtotime($utc)) . "\n";
Затем установите ваш локальный часовой пояс в PHP:
$timezone = "America/Guayaquil";
date_default_timezone_set($timezone);
Теперь получите смещение в секундах:
$offset = date('Z', strtotime($utc));
print "offset: $offset \n";
В завершение, добавьте смещение к целочисленному меткам времени вашего первоначального datetime:
print "LOCAL: " . date('r', strtotime($utc) + $offset) . "\n";
Таким образом, вы сможете корректно преобразовать время из UTC в локальное время, учитывая установленный часовой пояс.
Существует ли список временных зон Pytz?
Как вычислить разницу между двумя датами с помощью PHP?
Преобразование даты и времени UTC в локальное время
Получить дату в текущем часовом поясе на Java
Форматирование часового пояса для даты Carbon