Конвертировать даты UTC в местное время в PHP

23

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

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

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

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

Спасибо

Теги:
datetime
timezone

7 ответов

9
Лучший ответ

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

  • 3
    Но как мне получить текущую метку времени UTC?
  • 0
    Зачем вам нужна текущая метка времени UTC для преобразования сохраненной метки времени UTC?
Показать ещё 2 комментария
47

Функция 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);
  • 3
    Второй фрагмент кода - это то, что мне нужно для преобразования вывода функции datetime() из sqlite из UTC в местное время.
  • 1
    Спасибо, вы сэкономили мои часы.
Показать ещё 1 комментарий
28

Ответ

Преобразование даты и времени 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
  • 4
    Это должно быть ответом на вопрос выше ..
  • 1
    Это фактически отвечает на вопрос, а не предлагает «как получить местное время».
7

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

$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);
6

Сначала введите дату в 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";
  • 1
    Или, более кратко: $ local = date ($ format, strtotime ("$ utc $ offset секунд"));
  • 0
    дата не нужна, если у вас есть часовые пояса
1

Вот простой способ конвертировать время 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)

  • 0
    Как вы добавляете это?
  • 0
    Вы имеете в виду, как добавить разницу к отметке времени ???
Показать ещё 4 комментария
1

Я храню дату в БД в формате UTC, но затем я показываю их конечному пользователю в их локальном часовом поясе

// retrieve
$d = (new \DateTime($val . ' UTC'))->format('U');
return date("Y-m-d H:i:s", $d);
  • 0
    Чем это отличается от ответа, приведенного выше?
  • 0
    Фактически, если вы хотите переписать и расширить использование нового класса PHP DateTime, ваш ответ может стать новым уникальным способом достижения желаемого результата.
Сообщество Overcoder
Наверх
Меню