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

如何解决Yii2中asDuration方法计算时间差结果错误的问题

问题根因

错误来自对strtotime()函数的误用:

  • 你MySQL中存储的dt_add字段值本身就是整型Unix时间戳(对应GMT时间2022年6月5日 周日 10:04:33),并非可被日期解析的格式化字符串
  • strtotime()的作用是将格式化日期字符串解析为Unix时间戳,当你把纯数字时间戳传入该函数时,它无法正确识别格式,会返回错误的远古时间值,最终计算出跨度超千年的负向时间差
  • 额外优化点:获取当前Unix时间戳直接用time()即可,比strtotime('now')少了字符串解析的性能开销
修复后的代码

直接对整型时间戳做数值运算即可,不要对已经是时间戳格式的值调用strtotime():

public function getWasOnSite()
{
    // 强转字段值为整型,避免模型属性自动类型转换导致的计算异常
    $timePeriod = time() - (int)$this->dt_add;
    return \Yii::$app->formatter->asDuration($timePeriod);
}
效果说明

修复后传入asDuration()的是正确的秒级正时间差,方法会自动换算为你预期的天、小时、分钟级别的时长文本,不会再出现千年级别的错误差值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 10:21:27