PHP计算总工时结果不准确,需添加秒级计算修正
修复工时计算的秒级精度问题
你说得没错,原代码确实因为没有处理秒级时间差导致结果偏差。咱们直接修改代码,把秒数纳入计算,同时完善进位逻辑,就能得到精确的结果了。
问题分析
原代码只提取了时间差的小时($diff->h)和分钟($diff->i),完全忽略了秒($diff->s),而且最终输出也没考虑秒数。这就导致每次时间差的秒数都被丢弃,累积起来就出现了2分21秒的误差。
修改后的完整代码
<?php $data[0]['type'] = 'in'; $data[0]['created_at'] = '2019-02-01 08:01:52'; $data[1]['type'] = 'break'; $data[1]['created_at'] = '2019-02-01 12:00:40'; $data[2]['type'] = 'resume'; $data[2]['created_at'] = '2019-02-01 13:00:39'; $data[3]['type'] = 'break'; $data[3]['created_at'] = '2019-02-01 14:29:21'; $data[4]['type'] = 'resume'; $data[4]['created_at'] = '2019-02-01 14:29:50'; $data[5]['type'] = 'break'; $data[5]['created_at'] = '2019-02-01 14:29:53'; $data[6]['type'] = 'resume'; $data[6]['created_at'] = '2019-02-01 14:30:00'; $data[7]['type'] = 'break'; $data[7]['created_at'] = '2019-02-01 14:30:09'; $data[8]['type'] = 'resume'; $data[8]['created_at'] = '2019-02-01 14:30:12'; $data[9]['type'] = 'out'; $data[9]['created_at'] = '2019-02-01 18:01:51'; $hours = 0; $minutes = 0; $seconds = 0; // 新增秒变量 foreach($data as $key => $d){ $d['created_at'] = str_replace(" ","T",$d['created_at']); if($d['type'] == 'in' || $d['type'] == 'resume'){ $workingTime = new DateTime($d['created_at']); } if($d['type'] == 'break' || $d['type'] == 'out'){ $date2 = new DateTime($d['created_at']); $diff = $date2->diff($workingTime); // 累加所有时间维度 $hours += $diff->h + ($diff->days * 24); $minutes += $diff->i; $seconds += $diff->s; } } // 处理秒进位到分钟 if ($seconds >= 60) { $minutes += floor($seconds / 60); $seconds = $seconds % 60; } // 处理分钟进位到小时 if ($minutes >= 60) { $hours += floor($minutes / 60); $minutes = $minutes % 60; } // 格式化输出,确保秒和分钟是两位数字 echo sprintf("%d hours and %02d minutes and %02d seconds", $hours, $minutes, $seconds); ?>
关键改动说明
- 新增秒变量:初始化
$seconds = 0,专门存储秒级时间差的累加值 - 纳入秒计算:在循环中提取
$diff->s并累加到$seconds - 完善进位逻辑:先处理秒到分钟的进位,再处理分钟到小时的进位,确保时间单位的正确性
- 格式化输出:用
sprintf格式化分钟和秒为两位数字(比如05秒而不是5秒),输出更规范
运行修改后的代码,就能得到精确的8小时59分钟21秒结果了。
内容的提问来源于stack exchange,提问作者PinoyStackOverflower
相关产品推荐
相关产品推荐

