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

PHP 5.3.19中如何正确累加含分钟的总时长?仅小时累加成功的问题

问题分析

你现在的问题核心在于错误地对格式化后的字符串进行累加。humanReadableTime()返回的是类似"1:30"这样的字符串,当你用+=操作符对字符串进行累加时,PHP会自动将字符串转换为数值——它只会读取:之前的小时部分,分钟数直接被忽略,这就是为什么只有小时能正确累加的原因。

解决方案

正确的思路应该是:先累加原始的时间数值(比如小时浮点数或者总分钟数),最后再统一格式化为可读的小时:分钟字符串,而不是边格式化边累加。

下面提供两种可行的修正方案,适配你的PHP 5.3.19环境:

方案1:基于总分钟数累加(更直观,避免浮点数精度问题)

// 初始化总分钟数为0
$totalMinutes = 0;

// 遍历你的对象数组,假设每个对象的时间属性为 $item->workhours(比如1.5代表1小时30分钟)
foreach ($yourObjectArray as $item) {
    $timeInHours = $item->workhours;
    // 将当前时间转换为分钟数并累加
    $hoursToMinutes = floor($timeInHours) * 60;
    $minutes = ceil(($timeInHours - floor($timeInHours)) * 60);
    $totalMinutes += $hoursToMinutes + $minutes;
}

// 将总分钟数转换为可读格式
$totalHours = floor($totalMinutes / 60);
$remainingMinutes = $totalMinutes % 60;
// 确保分钟是两位数(比如5分钟显示为05)
$remainingMinutes = str_pad($remainingMinutes, 2, '0', STR_PAD_LEFT);

$total_human_readable_time = "{$totalHours}:{$remainingMinutes}";

方案2:复用你的humanReadableTime()函数(更简洁)

如果你想继续使用已有的格式化函数,可以直接累加原始的小时浮点数,最后再统一格式化:

// 初始化总工作小时数为0
$totalWorkHours = 0;

// 遍历对象数组,累加原始的小时数值
foreach ($yourObjectArray as $item) {
    $totalWorkHours += $item->workhours;
}

// 最后用你的函数格式化总时长
$total_human_readable_time = humanReadableTime($totalWorkHours);
为什么原来的代码无效?

举个例子:当你累加"1:30" + "2:15"时,PHP会把这两个字符串转换为数值1和2,结果得到3,完全丢失了分钟部分的信息。只有先累加原始的时间数值,再进行格式化,才能保证分钟数被正确计算。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:08:10