You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP DateTime::diff返回值异常:同条件下有时为1有时为0

问题分析与解决方案

这个问题我之前处理过类似的,核心根源在于你只给$today设置了0点时间,但$issue_due的时间部分是动态变化的!

为什么会出现-0和-1的差异?

当你用date_create_from_format("Y-m-d", $issue->Due_Date)创建DateTime对象时,PHP会自动把当前脚本运行的服务器时间填充到时间部分(比如你11:22运行脚本,$issue_due就会是2020-08-17 11:22:xx)。而$today被你固定成了当天0点(2020-08-18 00:00:00),这就导致:

  • 当脚本在凌晨运行时,$issue_due的时间是2020-08-17 04:12:xx,和$today的间隔≥24小时,diff返回-1
  • 当脚本在上午运行时,$issue_due的时间是2020-08-17 11:22:xx,和$today的间隔<24小时,diff返回-0

这就直接导致了日志里的状态反复切换:

  • 凌晨4点运行时,$diff=-1满足$diff<0,把状态改成past_due
  • 11点运行时,$diff=-0不满足$diff<0,但符合$diff<=5 && >=0,又把状态改回due_soon

修复方案

给$issue_due也设置0点时间,和$today保持统一的时间基准,这样日期比较就完全精确到天,不会受脚本运行时间影响:

$issue_due = date_create_from_format("Y-m-d", $issue->Due_Date);
$issue_due->setTime(0, 0, 0); // 加上这一行,统一时间基准!

额外优化建议

  • 把$today的创建提到循环外面,避免每次循环都重复创建DateTime对象,提升性能:
$today = new DateTime("now");
$today->setTime(0, 0, 0);

foreach ($issues as $issue) {
    // 后续逻辑代码...
}
  • 调试时可以把$issue_due的完整时间也打印出来,更直观地确认问题:
$DEBUG.= ', due full time: '.$issue_due->format('d-m-Y H:i:s');

内容的提问来源于stack exchange,提问作者Eugene

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 21:57:57