PHP UTC по местному времени - PullRequest
       35

PHP UTC по местному времени

19 голосов
/ 27 апреля 2011

Серверная среда

Redhat Enterprise Linux
PHP 5.3.5

Проблема

Допустим, у меня естьдата и время UTC, например, 2011-04-27 02:45, и я хочу преобразовать их в свое местное время, которое означает Америка / Нью-Йорк.

Три вопроса:

1.) Мой код ниже может решить проблему, вы согласитесь?

<?php

date_default_timezone_set('America/New_York');  // Set timezone.

$utc_ts = strtotime("2011-04-27 02:45");  // UTC Unix timestamp.

// Timezone offset in seconds. The offset for timezones west of UTC is always negative,
// and for those east of UTC is always positive.
$offset = date("Z");

$local_ts = $utc_ts + $offset;  // Local Unix timestamp. Add because $offset is negative.

$local_time = date("Y-m-d g:i A", $local_ts);  // Local time as yyyy-mm-dd h:m am/pm.

echo $local_time;  // 2011-04-26 10:45 PM

?>

2.) Но настраивается ли автоматически значение $ offset для перехода на летнее время (DST)?
3.) Если нет, то как настроить код для автоматической настройки на летнее время??Спасибо: -)

Ответы [ 4 ]

36 голосов
/ 27 апреля 2011

Это будет делать то, что вы хотите, используя родные PHP DateTime и DateTimeZone классы:

$utc_date = DateTime::createFromFormat(
                'Y-m-d G:i', 
                '2011-04-27 02:45', 
                new DateTimeZone('UTC')
);

$nyc_date = $utc_date;
$nyc_date->setTimeZone(new DateTimeZone('America/New_York'));

echo $nyc_date->format('Y-m-d g:i A'); // output: 2011-04-26 10:45 PM

См. DateTime :: createFromFormat man-страницу для получения дополнительной информации.

После некоторых экспериментов между часовыми поясами, которые имеют и не имеют в настоящее время DST , я обнаружил, что это будет учитывать DST.То же преобразование с использованием моего метода выше отображает то же самое время.

3 голосов
/ 28 июля 2014

Я знаю, что это старая запись, но есть еще одна строка, которую нужно добавить, чтобы получить правильное время.

Перед преобразованием в местное время необходимо установить часовой пояс по умолчанию в формате UTC, например(если это часовой пояс того времени, которое вы предоставляете):

function GmtTimeToLocalTime($time) {
    date_default_timezone_set('UTC');
    $new_date = new DateTime($time);
    $new_date->setTimeZone(new DateTimeZone('America/New_York'));
    return $new_date->format("Y-m-d h:i:s");
}
0 голосов
/ 08 июля 2016

Я улучшу ответ Хасина Хейдера

date_default_timezone_set('America/New_York');  // Set timezone.
$utc_ts = strtotime("2011-04-27 02:45 UTC");  // UTC Unix timestamp.
echo date('Y-m-d H:i:s a T', $utc_ts);

Он должен вывести

2011-04-26 10:45:00 pm EDT

Разница заключается в добавлении часового пояса источника.strtotime () тоже принимает часовой пояс!: Р

0 голосов
/ 27 апреля 2011
date_default_timezone_set('America/New_York');  // Set timezone.
$utc_ts = strtotime("2011-04-27 02:45");  // UTC Unix timestamp.

Сразу после выполнения этого $ utc_ts содержит местное время. PHP обрабатывает сам DST.

= Н =

...