DateTime :: getTimezone не возвращает имя часового пояса, но смещает - PullRequest
3 голосов
/ 27 апреля 2011
<?php
$first = '2011-04-27';
$second = '2011-04-27 16:20:12';
$third = '2011-04-27 16:20:12+00';

$dt = new DateTime($first);
$dt->setTimeZone(new DateTimeZone($dt->getTimeZone()->getName()));
echo $dt->getTimezone()->getName().'<br />';
// OK
$dt = new DateTime($second);
$dt->setTimeZone(new DateTimeZone($dt->getTimeZone()->getName()));
echo $dt->getTimezone()->getName().'<br />';
// OK
$dt = new DateTime($third);
$dt->setTimeZone(new DateTimeZone($dt->getTimeZone()->getName()));
echo $dt->getTimezone()->getName().'<br />';
// Error
// ->getName() returns unexpectedly +00, which is not a name, but offset

DateTime извлекает из последней строки часовой пояс name +00, который на самом деле не name , но offset и поэтому не может быть установленчасовой пояс ...

Такое поведение вызывает проблемы при (де) сериализации объекта DateTime ...

public function __sleep()
{
    $this->fix = array($this->format('Y-m-d H:i:s'), $this->getTimezone()->getName());
    return array('fix');
}

public function __wakeup()
{
    $this->__construct($this->fix[0], new DateTimeZone($this->fix[1]));
    unset($this->fix);
}

Я знаю, что было бы лучше получить, например, эту строку: 2011-04-27 16:20:12 UTC,в любом случае, если метод называется getName(), он не должен возвращать +00 в качестве имени или должен?

Ответы [ 2 ]

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

Когда я запускаю этот код, PHP говорит, что он не распознает этот формат (форматы определены здесь ), поэтому вывод является результатом ошибки.Тем не менее, я смог запустить его так:

$third = '2011-04-27 16:20:12 GMT';

$dt = new DateTime($third);
$dt->setTimeZone(new DateTimeZone($dt->getTimeZone()->getName()));
echo $dt->getTimezone()->getName().'<br />';

Я думаю, вы можете просто заменить +00 просто GMT.

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

Вы пытались создать DateTime объект со смещением часового пояса +00, поэтому он вернул смещение вместо действительного идентификатора часового пояса, что фактически означает GMT+0000.Используя строку даты и времени без смещения, вы получите идентификатор часового пояса PHP в соответствии с текущей настройкой часового пояса в объекте DateTime (или системе).

С $third = '2011-04-27 16:20:12+00'; вы установили смещение +00:00 в объекте DateTime вместо PHPидентификатор и DateTime просто возвращают это обратно методом ->getName().

Фиксированное смещение не предоставляет информацию о правилах перехода на летнее время, поэтому его нельзя использовать для возврата идентификатора PHP TimeZone.Пример: в моей зоне это GMT+2 в данный момент (активное DST), но если я помещу его в строку datetime, объект DateTime не сможет узнать, когда мое смещение изменится на +1, просто это всегда GMT + 0200 ...вот и все.

Смещение +00 в вашем случае соответствует множеству различных идентификаторов часовых поясов, таких как Atlantic/Reykjavík, Africa/Casablanca, Africa/Nouakchott и т. д.

Именно поэтому getName() метод возвращает смещение времени вместо часового пояса!

Это не официальное объяснение, но оно в короткой версии.

Конечно, 2011-04-27 16:20:12+00 не является допустимой строкой даты и времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...