PHP Carbon 日期时间对象比较是如何工作的?

How does PHP Carbon datetime object comparison work?

提问人:raveren 提问时间:6/23/2023 更新时间:6/23/2023 访问量:35

问:

根据 Carbon 文档

$first = Carbon::create(2012, 9, 5, 23, 26, 11);
$second = Carbon::create(2012, 9, 5, 20, 26, 11, 'America/Vancouver');

var_dump($first <= $second);     // bool(true)

后一种比较有效!!为什么?

我在互联网上能找到的只是

通过按定义的顺序递归比较对象的属性来比较对象,包括公共属性、受保护属性和私有属性。

所以我怀疑该实例将 datetime [*] 作为其第一个属性,因此对其进行了比较,但这引发了很多问题,我无法“介入”与 XDebug 的比较。Carbon2012-09-05 23:26:11

有人对此有一个很好的解释吗?

[*]ISO 格式的日期可以以字符串形式进行比较

PHP 日期时间 比较

评论


答:

0赞 raveren 6/23/2023 #1

好的,在写完这个问题之后,我想我可能已经找到了答案,根据 PHP 文档:

https://www.php.net/manual/en/datetime.diff.php#example-2091

注意:

可以使用比较运算符比较 DateTimeImmutable 和 DateTime 对象。

这导致:

https://www.php.net/manual/en/language.operators.comparison.php#language.operators.comparison.types

内置类可以定义自己的比较。

class Carbon extends DateTime // ...

因此,Carbon 扩展了一个内置类,该类支持其对象之间的比较。

这种比较之所以有效,是因为PHP开发人员对对象做了一个例外,并将其硬编码为PHP语言的C源代码。DateTime

评论

0赞 Álvaro González 6/24/2023
我不会将其描述为例外,但仅此而已。不过,根据我的经验,我发现将两个操作数都转换为 UTC 更可靠。在一些地方存在一些微妙的错误,与 DST 和比较中跨越时区边界有关。
0赞 raveren 6/26/2023
“我不会将其描述为例外” - “例外” - 名词,被排除在一般陈述之外或不遵守规则的人或事物。
0赞 raveren 6/26/2023
此外,Carbon 还负责时区转换,因为它在其文档中引用的示例中特意而优雅地演示了这一点。