Подтвердить что ты не робот

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

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

Redhat Enterprise Linux
PHP 5.3.5

Проблема

Скажем, у меня есть дата и время UTC, такие как 2011-04-27 02:45, и я хочу преобразуйте его в мое местное время, это America/New_York.

Три вопроса:

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.) Если нет, как мне настроить свой код для автоматической настройки для DST?

Спасибо: -)

4b9b3361

Ответ 1

Это сделает то, что вы хотите, используя собственные классы 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. То же преобразование с использованием моего метода выше дает то же самое время.

Ответ 2

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

Перед преобразованием в локальное время вам необходимо установить часовой пояс по умолчанию в 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");
}

Ответ 3

date_default_timezone_set('America/New_York');  // Set timezone.
$utc_ts = strtotime("2011-04-27 02:45");  // UTC Unix timestamp.

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

= Н =

Ответ 4

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

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() также принимает часовой пояс, вы знаете!: Р