PHP DateTime对象与修改的Timezone不相等

时间:2016-11-09 17:01:55

标签: php datetime

从PHP 5.2.2开始,支持使用比较运算符比较DateTime对象。

  

5.2.2与比较运算符的DateTime对象比较已更改为按预期工作。以前,所有DateTime对象都被认为是相等的(使用==)。

我的问题是,当我修改现有DateTime对象的时区时,它不再等于更改时区之前等于的DateTime对象。 Weirder仍然是如果我在修改后的DateTime对象上调用DateTime :: getTimestamp(),它现在将等于另一个DateTime对象。

例如:

<?php

$dt = new DateTime("2016-11-08 08:27:33am -08");
$dt2 = new DateTime("2016-11-08 09:27:33am -07");

var_dump($dt == $dt2);

$dt2->setTimezone(new DateTimeZone("-08"));

var_dump($dt == $dt2);
var_dump($dt < $dt2);
var_dump($dt > $dt2);

var_dump($dt2->getTimestamp());

var_dump($dt == $dt2);
var_dump($dt < $dt2);
var_dump($dt > $dt2);

将产生以下输出:

bool(true)

bool(false)
bool(false)
bool(true)

int(1478622453)

bool(true)
bool(false)
bool(false)

那是什么给出的?正如您所看到的,$dt$dt2在创建时是相同的,尽管它们位于不同的时区。但是,这种行为是可以预期的。 $dt$dt2都代表完全相同的时刻。如果您同时拨打getTimestamp(),则会获得相同的号码。同样,如果您明确设置两个DateTimes的时区,它们将是相等的。

PHP手册确实说明如果初始化字符串包含时区(或者是unix时间戳),则会忽略时区:

  

注意:   当$ time参数是UNIX时间戳(例如@ 946684800)或指定时区(例如2010-01-28T15:00:00 + 02:00)时,将忽略$ timezone参数和当前时区。

所以我确实认为这是这种看似不正常的行为的原因,但我不介意知道为什么。

那么,有没有人知道为什么DateTimes会像这样? DateTime对象实际如何比较?如果仍需要将DateTime对象与另一个DateTime对象进行比较,那么更改DateTime对象时区的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

那是php bug。要解决此问题,您可以扩展DateTime类并覆盖setTimezone方法,如下所示:

    class MyDateTime extends DateTime {
        public function setTimezone($timezone) {
            parent::setTimezone($timezone);
            $this->getTimestamp();
            return $this;
        }
    }