PHP Carbon日期时间对象比较机制解析:示例结果为何为true?
Carbon实例
<=比较结果为true的原因解析 先看你给出的代码示例:
$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)
这个结果看似反常,核心原因是两个Carbon实例的实际时间戳(UTC时间)存在先后差异,而非你猜测的按ISO字符串属性排序比较。
具体分析:
时区转换后的实际时间
$first使用PHP默认时区(通常为UTC或服务器本地时区,此处按UTC计算),对应UTC时间为2012-09-05 23:26:11;$second指定的America/Vancouver时区在2012年9月处于夏令时(PDT),与UTC时差为-7小时,将其本地时间2012-09-05 20:26:11转换为UTC后是2012-09-06 03:26:11。显然$first的实际时间早于$second,因此$first <= $second结果为true。PHP对象比较与Carbon的逻辑
你看到的“对象按属性定义顺序递归比较”是PHP原生对象比较的通用规则,但Carbon(继承自PHP原生DateTime类)重写了对象比较逻辑,实际比较的是时间戳对应的时间先后,而非表面的属性顺序。
另外补充:ISO格式的日期时间字符串可以直接按字符串顺序比较大小,结果与时间先后顺序一致——这是因为ISO格式按年、月、日、时、分、秒的固定顺序排列,字符顺序和时间先后完全匹配。
内容的提问来源于stack exchange,提问作者raveren
相关产品推荐
相关产品推荐

