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
相关产品推荐
相关产品推荐

