У меня возникли трудности с использованием PHP DateTime
для преобразования даты, полученной с часовым поясом GMT -8 (PST), в человекообразный формат с часовой пояс GMT -7 (PDT).Использование PHP DateTime для анализа и преобразования временной зоны PST в PDT (GMT -8 - GMT -7)
Вот пример:
$tz = new DateTimeZone('America/Los_Angeles');
$saleEndDate = new DateTime("2016-11-07T17:30:00-08:00");
$saleEndDate->setTimezone($tz);
echo $saleEndDate->format('Y-m-d H:i:s');
Выход выше код: 2016-11-07 17:30:00. Тем не менее, он должен отображать 2016-11-07 18:30:00, потому что America/Los_Angeles
теперь находится в летнем режиме (GMT -7, PDT).
Из того, что я прочитал в DateTime docs, команда new DateTime
должна иметь возможность интерпретировать, что строка 2016-11-07T17:30:00-08:00
имеет GMT -8 часовой пояс:
В часовой пояс параметр и текущий часовой пояс, игнорируются когда параметр либо содержит временную метку UNIX (например, 946684800), либо указывает часовой пояс (например, 2010-01-28T15: 00: 00 + 02: 00).
Несмотря на это, я не думаю, что DateTime
правильно признает GMT -8.
Кто-нибудь знает, какой подход необходим для правильной конвертации между часовыми поясами?
Update:
Я также попытался переходящая в DateTimeZone
в качестве второго параметра в DateTime
конструктора, но также безрезультатно:
$tz = new DateTimeZone('America/Los_Angeles');
$saleEndDate = new DateTime("2016-11-07T17:30:00-08:00", new DateTimeZone("America/Los_Angeles"));
$saleEndDate->setTimezone($tz);
echo $saleEndDate->format('Y-m-d H:i:s');
Также не работает:
$tz = new DateTimeZone('America/Los_Angeles');
$saleEndDate = new DateTime("2016-11-07T17:30:00", new DateTimeZone("PST"));
$saleEndDate->setTimezone($tz);
echo $saleEndDate->format('Y-m-d H:i:s');
Также не работает:
$tz = new DateTimeZone("PDT");
$saleEndDate = new DateTime("2016-11-07T17:30:00", new DateTimeZone("PST"));
$saleEndDate->setTimezone($tz);
echo $saleEndDate->format('Y-m-d H:i:s');
Я не спустил вниз, не одобрил ... но, может быть, я не понимаю здесь что-то ... почему вы думаете, что он должен преобразовать в 18:30 только потому, что сейчас это летнее время? -8 - это в основном Лос-Анджелес, поэтому, возможно, здесь нечего конвертировать. –
http://stackoverflow.com/questions/17694894/different-timezone-types-on-datetime-object «Только объекты DateTime с прикрепленными временными часами типа 3 позволят правильно выполнять DST». Ваш '$ saleEndDate' создается как тип 1. – ceejayoz
@PawelDubiel он должен преобразовать, потому что время предоставлено' -8', но набор часовых поясов '-7' – zerkms