PHP中计算数组时间总和:如何获取超24小时的正确结果
解决PHP中时间总和超过24小时的计数问题
我来帮你搞定这个问题——你遇到的核心问题是date()函数的H格式只会返回0-23的小时数,所以当总时长超过24小时时,它会自动把小时数对24取模,导致结果被截断成当天的时间,而不是真实的总时长。
原代码的问题分析
你的代码里,累加得到的sum2其实是正确的总秒数,但最后用date("H:i:s", $sum + $sum2)时,date()是把时间戳对应到具体的日期时间上(比如总秒数相当于第二天的11点04分28秒),所以它只会输出当天的小时部分(11),而不是累计的35小时。
正确的解决方案:直接计算总时长的时、分、秒
我们不需要依赖时间戳和date()函数,而是直接把每个时间转换成秒数累加,再将总秒数拆解成小时、分钟、秒,其中小时可以是任意大于0的数值:
$total = [ '00:02:55', '00:07:56', '01:03:32', '15:13:34', '02:13:44', '03:08:53', '13:13:54' ]; $totalSeconds = 0; // 遍历所有时间,累加总秒数 foreach ($total as $timeStr) { // 拆分时间字符串为小时、分钟、秒 list($hours, $minutes, $seconds) = explode(':', $timeStr); // 转换成秒数并累加 $totalSeconds += $hours * 3600 + $minutes * 60 + $seconds; } // 计算总小时数 $totalHours = floor($totalSeconds / 3600); // 剩余秒数计算分钟 $remainingAfterHours = $totalSeconds % 3600; $totalMinutes = floor($remainingAfterHours / 60); // 最后剩余的秒数 $totalSecondsFinal = $remainingAfterHours % 60; // 格式化输出,确保分钟和秒是两位数(比如5秒显示为05) $formattedTotal = sprintf('%02d:%02d:%02d', $totalHours, $totalMinutes, $totalSecondsFinal); echo $formattedTotal; // 输出:35:04:28
代码逻辑说明
- 累加总秒数:把每个
H:i:s格式的时间拆成时、分、秒,转换成秒数后累加,得到所有时间的总秒数。 - 拆解总时长:
- 总小时数 = 总秒数 ÷ 3600(取整数部分)
- 剩余秒数 = 总秒数 % 3600
- 总分钟数 = 剩余秒数 ÷ 60(取整数部分)
- 最终秒数 = 剩余秒数 % 60
- 格式化输出:用
sprintf确保分钟和秒始终是两位数,小时数则显示真实的累计值,哪怕超过24。
内容的提问来源于stack exchange,提问作者Nipun Sachinda
相关产品推荐
相关产品推荐

