Преобразование даты UTC в local time в PHP

Я храню даты UTC в БД, используя:

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

а затем я хочу преобразовать сохраненную дату UTC в локальное время клиента.

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

благодаря

Solutions Collecting From Web of "Преобразование даты UTC в local time в PHP"

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

http://www.php.net/manual/en/function.date-default-timezone-set.php

http://us3.php.net/manual/en/function.date.php

http://php.net/manual/en/function.localtime.php

Функция strtotime PHP будет интерпретировать коды часовых strtotime , например, UTC. Если вы получаете дату из базы данных / клиента без кода часового пояса, но знаете, что это UTC, вы можете добавить его.

Предполагая, что вы получаете дату с кодом метки времени (например, «Пт мар 23, 2012 22:23:03 GMT-0700 (PDT)», что и есть код Javascript ""+(new Date()) ):

 $time = strtotime($dateWithTimeZone); $dateInLocal = date("Ymd H:i:s", $time); 

Или, если вы этого не сделаете, что, скорее всего, из MySQL, тогда:

 $time = strtotime($dateInUTC.' UTC'); $dateInLocal = date("Ymd H:i:s", $time); 

Ответ

Преобразование даты и времени UTC в Америку / Денвер

 // create a $dt object with the UTC timezone $dt = new DateTime('2016-12-12 12:12:12', new DateTimeZone('UTC')); // change the timezone of the object without changing it's time $dt->setTimezone(new DateTimeZone('America/Denver')); // format the datetime $dt->format('Ymd H:i:s T'); 

Заметки

time() возвращает time() метку unix , которая является номером, у нее нет часовой пояс.

date('Ymd H:i:s T') возвращает дату в текущем часовом поясе локали.

gmdate('Ymd H:i:s T') возвращает дату в UTC

date_default_timezone_set() изменяет текущий часовой пояс локали

изменить время в часовом поясе

 // create a $dt object with the America/Denver timezone $dt = new DateTime('2016-12-12 12:12:12', new DateTimeZone('America/Denver')); // change the timezone of the object without changing it's time $dt->setTimezone(new DateTimeZone('UTC')); // format the datetime $dt->format('Ymd H:i:s T'); 

здесь вы можете увидеть все доступные часовые пояса

https://en.wikipedia.org/wiki/List_of_tz_database_time_zones

здесь все параметры форматирования

http://php.net/manual/en/function.date.php

Обновление базы данных часового пояса PHP (в Linux)

 sudo pecl install timezonedb 

Арифметика даты не нужна, если вы просто хотите отображать одну и ту же метку времени в разных часовых поясах:

 $format = "M d, Y h:ia"; $timestamp = gmdate($format); date_default_timezone_set("UTC"); $utc_datetime = date($format, $timestamp); date_default_timezone_set("America/Guayaquil"); $local_datetime = date($format, $timestamp); 

Во-первых, получите дату в 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, но затем я показываю их конечному пользователю в их локальном часовом поясе

 // retrieve $d = (new \DateTime($val . ' UTC'))->format('U'); return date("Ymd H:i:s", $d); 

Вот прямой способ конвертировать время UTC опроса в местное время. Это время хранится в базе данных и т. Д., Т.е. в любое время. Вы только что должны найти разницу во времени между временем UTC и местным временем, в котором вы заинтересованы, а затем просто сохранить время UTC, добавляя к нему разницу.

 $df = "G:i:s"; // Use a simple time format to find the difference $ts1 = strtotime(date($df)); // Timestamp of current local time $ts2 = strtotime(gmdate($df)); // Timestamp of current UTC time $ts3 = $ts1-$ts2; // Their difference 

Затем вы можете добавить эту разницу в сохраненное время UTC. (На моем месте, Афины, разница ровно 5:00:00)