使用PHP DateTime比较操作符检查日期一致性:为何两个DateTime实例不相等?
解决DateTime实例仅比较日期部分(d-m-Y)的问题
你猜的完全正确!用==比较两个DateTime实例时,确实会包含微秒级的时间信息——哪怕你通过format('d-m-Y H:i:s')输出的秒数完全一致,只要两个实例的微秒不同,==就会返回false。这不是PHP版本的bug,而是DateTime对象的比较逻辑就是基于完整的时间戳(包含微秒)来判定的。
下面给你两种不需要格式化字符串的可靠方法,来仅比较两个DateTime实例的日期部分(年月日):
方法1:使用DateTime::diff()计算日期差值
通过计算两个DateTime实例的时间差,检查差值的年、月、日是否都为0,就能判断是否为同一天:
<?php $a = new DateTime(); $b = new DateTime(); // 计算两个实例的时间差,返回DateInterval对象 $dateDiff = $a->diff($b); // 当差值的年、月、日都为0时,说明日期完全一致 if ($dateDiff->y === 0 && $dateDiff->m === 0 && $dateDiff->d === 0) { echo "same date"; }
这种方法的优势是不会修改原有的DateTime实例,对后续操作没有影响。
方法2:重置时间为当天起始点后再比较
把两个DateTime实例的时间部分都设置为当天的00:00:00,此时用==比较就只会对比日期部分了:
<?php $a = new DateTime(); $b = new DateTime(); // 将两个实例的时间重置为当天0点 $a->setTime(0, 0, 0); $b->setTime(0, 0, 0); // 此时==比较的就是同一天的起始时间,日期一致则返回true if ($a == $b) { echo "same date"; }
如果你的业务场景允许修改原实例的时间,这种方法更直观高效。
补充:为什么原来的==不生效?
你可以用format('u')查看DateTime实例的微秒部分:
var_dump($a->format('u')); var_dump($b->format('u'));
几乎同时创建的两个DateTime实例,微秒值大概率是不同的——这就是==不返回true的核心原因,因为对象的比较逻辑会把这部分微秒差异算进去。
内容的提问来源于stack exchange,提问作者Haleorom Lefirio
相关产品推荐
相关产品推荐

