PHP使用数据库时间计算工时出现「非有效数值」警告求助
解决PHP时间字符串运算的警告问题
这个警告其实是PHP在直白地提醒你:“你直接拿带冒号的时间字符串做算术啦!” 虽然最后结果碰巧是对的,但这种写法完全依赖PHP的自动类型转换,非常不可靠,还会抛出讨厌的提示。
问题根源
你从数据库拿到的$JobEnd、$JobStart、$Break都是HH:MM:SS格式的字符串(比如17:00:00)。直接对这类带非数字符号的字符串做减法时,PHP会硬着头皮尝试把它们转成数字,但这种格式根本不符合数值规范,所以就触发了A non well formed numeric value encountered的警告。
正确解决方案:用PHP时间类处理
推荐用PHP内置的DateTime和DateInterval类来处理时间差,这是PHP处理时间逻辑的标准姿势,彻底避免类型转换的坑:
// 将时间字符串转为DateTime对象(确保格式是H:i:s) $jobStart = DateTime::createFromFormat('H:i:s', $JobStart); $jobEnd = DateTime::createFromFormat('H:i:s', $JobEnd); $breakTime = DateTime::createFromFormat('H:i:s', $Break); // 计算下班与上班的时长差 $workInterval = $jobEnd->diff($jobStart); // 转换为总分钟数 $totalWorkMinutes = ($workInterval->h * 60) + $workInterval->i; // 计算休息时间的总分钟数 $totalBreakMinutes = ($breakTime->format('H') * 60) + $breakTime->format('i'); // 最终有效工作时长 $DayJobTime = $totalWorkMinutes - $totalBreakMinutes; echo $DayJobTime;
另一种简洁写法:转时间戳计算
如果你的时间都是当天的,也可以把字符串转成Unix时间戳(秒数)来快速计算:
// 转换为当天的时间戳 $startTs = strtotime($JobStart); $endTs = strtotime($JobEnd); $breakTs = strtotime($Break); // 计算总秒数差后转成分钟 $DayJobTime = (($endTs - $startTs) - $breakTs) / 60; echo $DayJobTime;
为什么这样更好?
- 彻底消除类型转换警告,代码运行更稳定
- 逻辑清晰,其他开发者一眼就能看懂你在处理时间计算
- 扩展性强:如果以后时间格式带上日期(比如
2024-05-20 17:00:00),只需要调整格式参数就能兼容
内容的提问来源于stack exchange,提问作者Andrius
相关产品推荐
相关产品推荐

