PHP中日期时间比较运算符>=无法匹配当日日期的问题
解决当日及未来活动显示的时间比较问题
看起来你遇到了时间戳比较的常见坑——咱们来理清楚问题出在哪,然后搞定它!
问题根源
你原来的代码里,strtotime($dateFrom)如果是类似YYYY-MM-DD的纯日期格式,会被解析为当天00:00:00的时间戳;而time()返回的是当前精确到秒的时间戳(比如当天下午2点的话,数值会远大于当天0点的时间戳)。
所以当你用strtotime($dateFrom) >= time()时,只有那些日期在明天及以后的活动才会被选中——当天的活动因为0点的时间戳小于当前时间,直接被过滤掉了。而改成<=时,当天0点的时间戳自然小于等于当前时间,所以会包含当天和更早的活动,这就出现了你看到的反向结果。
解决方案
我们需要把当前时间的基准统一到当日0点,这样就能正确筛选出当日及未来的活动了,这里有两种靠谱的写法:
写法1:用当日0点的时间戳比较
public function getInspirationsMeetingIds() { $ids = []; if (($inspirationMeetings = $this->getCustomField('meetings'))) { // 获取当日00:00:00的时间戳 $todayStart = strtotime('today'); foreach ($inspirationMeetings as $meeting) { $row = new Inspiration($meeting['meeting']); $dateFrom = $row->getCustomField('date'); // 用当日0点的时间戳作为比较基准 if (strtotime($dateFrom) >= $todayStart) { $ids[] = $row->getId(); } } } return $ids; }
写法2:直接比较日期字符串(更直观)
如果你的dateFrom是标准的日期格式(比如YYYY-MM-DD),也可以直接转成日期字符串来比较,完全避开时分秒的干扰:
public function getInspirationsMeetingIds() { $ids = []; if (($inspirationMeetings = $this->getCustomField('meetings'))) { $currentDate = date('Y-m-d'); foreach ($inspirationMeetings as $meeting) { $row = new Inspiration($meeting['meeting']); $dateFrom = $row->getCustomField('date'); // 转成统一格式的日期字符串后比较 if (date('Y-m-d', strtotime($dateFrom)) >= $currentDate) { $ids[] = $row->getId(); } } } return $ids; }
这两种写法都能帮你正确筛选出当日及之后举办的活动,选哪种取决于你的代码习惯~
内容的提问来源于stack exchange,提问作者Jon Steinar Björgvinsson
相关产品推荐
相关产品推荐

