如何解决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
相关产品推荐
相关产品推荐

