Symfony7中DateTime对象比较异常:条件始终为True问题排查
问题原因及解决方法
核心原因
你遇到的问题是PHP类型自动转换导致的字符串字典序比较,而非时间逻辑上的比较:
- 当把
\DateTime对象和字符串直接比较时,PHP会自动将$time(DateTime对象)转换成默认格式的字符串:YYYY-MM-DD HH:MM:SS(比如2024-04-06 22:13:00)。 - 而
$warning->getEnd()返回的是d.m.Y - H:i:s格式的字符串(比如06.04.2024 - 22:13:00)。 - 字符串比较是按字典序进行的,
2开头的字符串(DateTime转换而来)必然比0开头的(getEnd返回的)大,所以无论实际时间差是多少,$time > $warning->getEnd()都会返回true。
解决方法
有两种可靠的处理方式:
1. 将字符串时间转为DateTime对象再比较
把getEnd()返回的字符串按指定格式解析成DateTime对象,再和当前时间对象比较:
// 创建当前时间对象 $time = new \DateTime(); // 解析警告结束时间字符串为DateTime对象 $warningEnd = \DateTime::createFromFormat('d.m.Y - H:i:s', $warning->getEnd()); // 先判断解析是否成功,再执行比较逻辑 if ($warningEnd && $time > $warningEnd) { // 执行警告过期的相关逻辑 }
2. 修改实体的getEnd方法,直接返回DateTime对象
如果你的实体中$end字段本身存储的就是DateTime类型,直接让getEnd()返回该对象,彻底避免字符串转换问题:
// 实体类中的getEnd方法 public function getEnd(): ?\DateTimeInterface { return $this->end; } // 控制器中直接比较两个DateTime对象 $time = new \DateTime(); if ($time > $warning->getEnd()) { // 执行警告过期的相关逻辑 }
内容的提问来源于stack exchange,提问作者Ghostik_GER
相关产品推荐
相关产品推荐

