0

Преобразование UTC-дате в локальное время в PHP

8

Проблема с конвертацией UTC даты в локальное время

Я сохраняю даты в формате UTC в базе данных с помощью следующего кода:

$utc = gmdate("M d Y h:i:s A");

Теперь мне нужно конвертировать сохраненную дату в формате UTC в локальное время клиента.

Как я могу это сделать?

Спасибо!

5 ответ(ов)

0

Если вы используете функцию 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 и преобразовать ее в локальное время.

0

Вы можете использовать следующий код для преобразования 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, в зависимости от времени).

0

В вашем коде нет необходимости в арифметике дат, если вам просто нужно отобразить одно и то же время в разных часовых поясах. Правильный подход заключается в использовании функции 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, и в результате вы можете получить одинаковую метку времени, независимо от установленного часового пояса. Таким образом, вы просто изменяете его отображение в зависимости от часовой зоны, что позволяет достичь желаемого результата без необходимости выполнять сложные вычисления.

0

date() и localtime() используют локальный часовой пояс сервера, если не переопределены; вы можете изменить используемый часовой пояс с помощью функции date_default_timezone_set().

Дополнительные сведения можно найти в официальной документации:

0

Чтобы получить локальное время на основе времени в формате 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 в локальное время, учитывая установленный часовой пояс.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь