日期时区有时会转换为UTC并且格式不正确

时间:2013-11-19 16:59:37

标签: php datetime symfony timezone date-formatting

我有一个对象,在所述对象的构造函数中,我传递了另一个从API发布的对象。相关的构造函数代码是:

    $this->timeStamp = new \DateTime($location->timeStamp, new \DateTimeZone('UTC'));
    if ($apiTime instanceof \DateTimeZone) {
        $timeZone = $apiTime;
    } else {
        $timeZone = new \DateTimeZone('UTC');
    }
    $this->localTimeStamp = date_create($location->timeStamp, new \DateTimeZone('UTC'))->setTimeZone($timeZone);
    $this->localTimeStampFake = $this->localTimeStamp;
    $this->localTimeStampFormatted = date_create($this->localTimeStamp->format('Y-m-d H:i:s'), $timeZone)->format('m/d/Y g:iA T');

$ location对象的timeStamp属性的格式如下:“2013-10-28T16:30:55.000Z”。大多数情况下,传递的日期最终会被正确格式化,例如:“11/12/2013 9:36 AM CST”。但偶尔也会这样:“2013年11月18日下午7:47 +00:00”

在这些情况下,我可以看到时区没有正确转换(我们通常不想要UTC,在这个构造函数的情况下,我们总是传递一个新的DateTimeZone实例并传递给那个类“US / Central“或用户恰好在的任何时区)。关于可能导致这种行为的任何想法?

1 个答案:

答案 0 :(得分:1)

请参阅DateTime::__construct($time, $timezone)方法的第二个参数的注释:

  当$ time参数是UNIX时间戳(例如@ 946684800)或指定时区(例如2010-)时,

$ timezone参数和当前时区将被忽略 01-28T15:00:00 + 02:00)

这意味着,如果您输入的$time格式与您的2013-10-28T16:30:55.000Z一样,则给定时区作为DateTime构造函数的第二个参数将被忽略。 See examples其中忽略所有给定时区,并使用输入时区( Z = Zulu = UTC = +00:00 )。

$dt = new DateTime('2013-10-28T16:30:55.000Z', new DateTimezone('Africa/Dakar'));
//                                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//                                             this parameter is ignored

如果您希望更改给定DateTime对象的时区,可以在创建DateTime对象(setTimezone())后使用demo方法:

$dt = new DateTime('2013-10-28T16:30:55.000Z');
$dt->setTimezone(new DateTimezone('Africa/Dakar'));

尝试这样的事情:

$this->timeStamp = new \DateTime($location->timeStamp);
$local = clone $this->timeStamp;
if ($apiTime instanceof \DateTimeZone) $local->setTimezone($apiTime);
$this->localTimeStamp = $local;
$this->localTimeStampFormatted = $local->format('m/d/Y g:iA T');