PHP DateTime以UTC格式获取格式而不转换对象

时间:2016-05-26 11:13:22

标签: php datetime timezone

我有一个对象,其属性是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');
}

1 个答案:

答案 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');
    }