Я храню даты UTC в БД, используя:
$utc = gmdate("M d Y h:i:s A");
а затем я хочу преобразовать сохраненную дату UTC в локальное время клиента.
Как я могу это сделать?
благодаря
date()
и localtime()
используют локальный часовой пояс для сервера, если не переопределены; вы можете переопределить часовой пояс, используемый с date_default_timezone_set()
.
http://www.php.net/manual/en/function.date-default-timezone-set.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)