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

PHP+MySQL计算工时总和多1小时问题求助(附代码)

问题根源

你遇到的总工时多1小时问题,核心原因是date('H:i', $totalWorkTime)会使用服务器本地时区解析时间戳。$totalWorkTime是工时总秒数,本质是从1970-01-01 00:00:00 UTC开始累加的秒数,若服务器时区比UTC早1小时(比如UTC+1),date()会自动转换成本地时间,导致显示的小时数多1。

解决方案:用DateTimeImmutable规避时区影响

DateTimeImmutable支持指定时区,我们可以强制使用UTC时区解析总秒数,彻底避免本地时区的干扰。

代码修改步骤

  1. 删除原代码中的$hhh = date('H:i',$totalWorkTime);
  2. 替换为以下代码:
// 用DateTimeImmutable创建UTC时区的时间实例
$date = DateTimeImmutable::createFromFormat('U', (string)$totalWorkTime, new DateTimeZone('UTC'));
$hhh = $date->format('H:i');

替代方案:手动计算时分(无需DateTimeImmutable)

如果不想引入新类,也可以直接通过数学计算得到准确的时分:

// 拆分总秒数为小时和分钟
$hours = floor($totalWorkTime / 3600);
$minutes = floor(($totalWorkTime % 3600) / 60);
// 格式化补零,确保显示为HH:mm格式
$hhh = sprintf('%02d:%02d', $hours, $minutes);
修改后的核心代码片段

替换后的循环部分完整代码如下:

$totalWorkTime = 0; // 初始化总工时变量

while ($row = mysqli_fetch_array($result)) {
    echo "<tr>";
    echo "<td>" . $row['empid'] . "</td>";
    echo "<td>" . $row['empname'] . "</td>";
    echo "<td>" . $row['company1'] . "</td>";
    echo "<td>" . date('d-M-Y', strtotime($row['date1'])) . "</td>";

    echo "<td>" . $row['wrktime'] . "</td>";
    echo "<td>" . $row['bbb1'] . "</td>";

    // 更新总工时
    $totalWorkTime += $row['bbb1'];
    
    // 使用DateTimeImmutable计算并格式化总工时
    $date = DateTimeImmutable::createFromFormat('U', (string)$totalWorkTime, new DateTimeZone('UTC'));
    $hhh = $date->format('H:i');

    echo "</tr>";
}
为什么DateTimeImmutable有效?

DateTimeImmutable是不可变的日期时间类,通过指定UTC时区,我们确保解析总秒数时完全忽略服务器本地时区的偏移,直接输出UTC时间的时分值,也就是你需要的准确总工时。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 09:05:25