PHP中如何将时间存入字符串变量?现有代码计算错误求修正
修复时间累加计算的问题
你的代码主要问题出在没有正确初始化和累加总秒数,另外还有一些可以优化的地方,我来一步步帮你修复:
问题分析
$seconds变量未初始化且未累加:你在循环里每次都重新赋值$seconds,而不是把每次的时间消耗加进去,而且循环外没有先把它初始化为0,最后计算时只会用到最后一次循环的值(甚至可能因为未初始化报错)。- 重复计算基准值:
strtotime('00:00:00')是固定值,没必要每次循环都计算一遍,既浪费性能又冗余。 - 初始时间处理冗余:你的初始
$time是'00:00:00',对应的秒数就是0,完全可以直接从0开始累加,不用额外计算初始值的差。
修复方案一:使用strtotime简化计算
这个方法适合确保时间格式是标准HH:MM:SS的场景:
// 初始化总秒数为0,因为初始时间是00:00:00 $total_seconds = 0; // 提前计算基准时间,避免重复计算 $base_time = strtotime('00:00:00'); foreach($GameLog->gamelogs->toArray() as $Data){ // 把当前记录的时间消耗转换成秒数 $spent_seconds = strtotime($Data['pivot']['time_spent']) - $base_time; // 累加到总秒数里 $total_seconds += $spent_seconds; } // 把总秒数转换回HH:MM:SS格式 $hours = floor($total_seconds / 3600); $minutes = floor(($total_seconds % 3600) / 60); $seconds = $total_seconds % 60; $ResultArray['time'] = sprintf('%02d:%02d:%02d', $hours, $minutes, $seconds);
修复方案二:直接拆分时间字符串(更可靠)
如果担心strtotime可能因为时区或格式问题出错,直接拆分时分秒计算会更稳定:
$total_seconds = 0; foreach($GameLog->gamelogs->toArray() as $Data){ $time_str = $Data['pivot']['time_spent']; // 按冒号拆分时分秒 list($hours_spent, $minutes_spent, $seconds_spent) = explode(':', $time_str); // 计算当前记录的总秒数并累加 $total_seconds += ($hours_spent * 3600) + ($minutes_spent * 60) + $seconds_spent; } // 转换回HH:MM:SS格式 $hours = floor($total_seconds / 3600); $minutes = floor(($total_seconds % 3600) / 60); $seconds = $total_seconds % 60; $ResultArray['time'] = sprintf('%02d:%02d:%02d', $hours, $minutes, $seconds);
关键修改点
- 初始化
$total_seconds为0,确保从正确的起点开始累加 - 循环内用
+=替代直接赋值,实现时间的累加计算 - 优化了时分秒的转换逻辑,让代码更清晰易读
- 方案二避免了依赖
strtotime的解析规则,兼容性和稳定性更好
这样修改后,就能正确累加所有time_spent的值,得到准确的总时间了。
内容的提问来源于stack exchange,提问作者Imran Abbas
相关产品推荐
相关产品推荐

