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

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);
?>

关键改动说明

  1. 新增秒变量:初始化$seconds = 0,专门存储秒级时间差的累加值
  2. 纳入秒计算:在循环中提取$diff->s并累加到$seconds
  3. 完善进位逻辑:先处理秒到分钟的进位,再处理分钟到小时的进位,确保时间单位的正确性
  4. 格式化输出:用sprintf格式化分钟和秒为两位数字(比如05秒而不是5秒),输出更规范

运行修改后的代码,就能得到精确的8小时59分钟21秒结果了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:27:32