gpt4 book ai didi

PHP DateTime 对象不等于修改后的时区

转载 作者:搜寻专家 更新时间:2023-10-31 21:51:49 25 4
gpt4 key购买 nike

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

5.2.2 DateTime object comparison with the comparison operators changed to work as expected. Previously, all DateTime objects were considered equal (using ==).

我的问题是,当我修改现有 DateTime 对象的时区时,它不再等于更改时区之前等于的 DateTime 对象。更奇怪的是,如果我在修改后的 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(),你会得到相同的数字。同样,如果您显式设置两个 DateTime 的时区,它们将相等。

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

Note: The $timezone parameter and the current timezone are ignored when the $time parameter either is a UNIX timestamp (e.g. @946684800) or specifies a timezone (e.g. 2010-01-28T15:00:00+02:00).

所以我确实相信这是造成这种看似不正常行为的原因,但我不介意知道原因。

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

最佳答案

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

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

关于PHP DateTime 对象不等于修改后的时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40512295/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com