我有一个对象,在所述对象的构造函数中,我传递了另一个从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“或用户恰好在的任何时区)。关于可能导致这种行为的任何想法?
答案 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');