从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对象时区的最佳方法是什么?
答案 0 :(得分:0)
那是php bug。要解决此问题,您可以扩展DateTime类并覆盖setTimezone方法,如下所示:
class MyDateTime extends DateTime {
public function setTimezone($timezone) {
parent::setTimezone($timezone);
$this->getTimestamp();
return $this;
}
}