我有一个对象,其属性是DateTime
对象,具有设置的时区,具体取决于用户的时区。在某些时候,我需要将对象存储在我的存储层中属性为UTC日期时间字符串,但是我可能需要在持久化之后继续使用该对象,并且当前我的方法将对象转换为另一个时区然后设置它回到过去:
/* "starts" is the name of the property and this is just a "magic" method my driver
will call before persisting the object. */
public function __persist_starts() {
$tz = $this->starts->getTimezone();
$this->starts->setTimezone(new DateTimeZone("UTC"));
$value = $this->starts->format('Y-m-d H:i:s');
$this->starts->setTimezone($tz);
return $value;
}
这似乎是一个" hacky"解决方案,我可以使用更清楚的东西。我想象的是
public function __persist_starts() {
return $this->starts->formatUTC('Y-m-d H:i:s');
}
答案 0 :(得分:2)
虽然没有像formatUTC
这样的内容,但是其他选项很少,比“hacky”解决方案稍好一些:
DateTimeImmutable
代替DateTime
。克隆原始对象:
public function __persist_starts() {
$utc = clone $this->starts;
return $utc->setTimezone(new \DateTimeZone("UTC"))
->format('Y-m-d H:i:s');
}
创建一个新对象:
public function __persist_starts() {
return \DateTime::createFromFormat(
'U',
$this->starts->getTimestamp(),
new \DateTimeZone("UTC")
)->format('Y-m-d H:i:s');
}