Я храню даты UTC в БД, используя:
$utc = gmdate("M d Y h:i:s A");
а затем я хочу преобразовать сохраненную дату UTC в локальное время клиента.
Как я могу это сделать?
Спасибо
Я храню даты 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
Функция PHP strtotime
будет интерпретировать коды часовых поясов, например, UTC. Если вы получаете дату из базы данных/клиента без кода часового пояса, но знаете это UTC, вы можете добавить его.
Предполагая, что вы получаете дату с кодом временной метки (например, "Пт мар 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 в Америку/Денвер
// 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 time
$dt->setTimezone(new DateTimeZone('America/Denver'));
// format the datetime
$dt->format('Y-m-d H:i:s T');
time()
возвращает временную метку unix, которая является номером, у нее нет часовой пояс.
date('Y-m-d H:i:s T')
возвращает дату в текущем часовом поясе.
gmdate('Y-m-d 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 time
$dt->setTimezone(new DateTimeZone('UTC'));
// format the datetime
$dt->format('Y-m-d 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("Y-m-d 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)