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