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

PHP致命错误:在布尔值上调用diff()函数,DateTime格式化问题求助

问题分析与解决方案

嘿,这个问题我之前帮朋友排查过,咱们来一步步搞清楚问题出在哪,以及怎么解决:

错误根源

你碰到的PHP Fatal error: Call to a member function diff() on boolean,本质是DateTime::createFromFormat()调用失败,返回了布尔值false(而不是预期的DateTime对象),后续调用diff()自然就触发了致命错误。

导致失败的两个核心问题:

  • 时间字符串未加引号:你写的2000-01-01 00:00:00没有用单/双引号包裹,PHP会把它当成算术表达式计算(2000-1-1-0-0-0=1998),这完全不是合法的时间字符串,直接导致解析失败。
  • 格式字符串不匹配:你指定的格式是Y-m-d H:i:s.u,其中.u代表微秒部分,但你传入的时间字符串没有微秒,格式不匹配也会让createFromFormat返回false。

修正后的代码

我给你两种可行的修正方案,你可以根据实际需求选择:

方案1:去掉格式中的微秒(适合输入无需求秒的场景)

$Time = new DateTime('now', new DateTimeZone('UTC'));
// 修正:给时间字符串加引号,格式去掉.u
$DBTime = DateTime::createFromFormat('Y-m-d H:i:s', '2000-01-01 00:00:00', new DateTimeZone('UTC'));

// 建议:先判断对象是否创建成功,避免致命错误
if ($DBTime instanceof DateTime) {
    $Interval = $DBTime->diff($Time);
    // 这里可以根据需求使用$Interval,比如输出间隔信息
    echo "时间间隔:" . $Interval->y . "年" . $Interval->m . "月" . $Interval->d . "天";
} else {
    echo "时间解析失败,请检查输入格式";
}

方案2:保留微秒格式(给输入补充微秒部分)

如果业务必须要求格式包含微秒,只需要给时间字符串加上.000000(代表0微秒)即可:

$Time = new DateTime('now', new DateTimeZone('UTC'));
$DBTime = DateTime::createFromFormat('Y-m-d H:i:s.u', '2000-01-01 00:00:00.000000', new DateTimeZone('UTC'));

if ($DBTime instanceof DateTime) {
    $Interval = $DBTime->diff($Time);
    print_r($Interval);
} else {
    echo "时间解析失败,请检查输入格式";
}

额外建议

每次使用DateTime::createFromFormat()后,一定要先检查返回值是否为有效的DateTime对象,这样可以避免类似的致命错误,让代码更健壮。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:34:23