PHP Laravel 累加H:i:s格式时长输出i:s格式队列总时长的方法
Laravel 歌曲队列总时长计算实现方案
你原先的写法存在逻辑错误:数据库存储的duration是H:i:s格式的字符串,直接做数值相加时PHP会自动将字符串转换为开头的数字(比如00:02:53会被转成0),最终累加结果永远为0,需要先将单首歌时长转换为总秒数累加后再格式化输出。
步骤1:累加总秒数
如果$queuelist是普通数组,用foreach实现:
// 初始化总秒数 $totalSeconds = 0; foreach ($queuelist as $song) { // 拆分时分秒字段 [$hours, $minutes, $seconds] = explode(':', $song->duration); // 转成秒数累加 $totalSeconds += $hours * 3600 + $minutes * 60 + $seconds; }
如果$queuelist是Laravel Eloquent集合,可以用sum方法简化写法:
$totalSeconds = $queuelist->sum(function ($song) { [$h, $i, $s] = explode(':', $song->duration); return $h * 3600 + $i * 60 + $s; });
步骤2:格式化输出为需求格式
场景1:总时长不超过1小时
可以直接用gmdate函数快速格式化:
// 带前导零的i:s格式,输出示例:02:53 $formattedWithZero = gmdate('i:s', $totalSeconds); // 无前导零的简化格式,输出示例:2:53 $formattedSimple = ltrim(gmdate('i:s', $totalSeconds), '0');
场景2:支持超过1小时的总时长
gmdate的分钟字段最大只返回59,超过1小时的场景需要手动计算总分钟数:
$totalMinutes = floor($totalSeconds / 60); $remainSeconds = $totalSeconds % 60; // 带前导零格式,示例输出:65:30(对应1小时5分30秒) $formattedWithZero = sprintf('%02d:%02d', $totalMinutes, $remainSeconds); // 无前导零简化格式,示例输出:65:30 / 2:53 $formattedSimple = sprintf('%d:%02d', $totalMinutes, $remainSeconds);
可选:封装为全局辅助函数
如果多处需要用到该逻辑,可以在Laravel项目中封装为公共辅助函数:
- 新建
app/Helpers.php文件,添加如下代码:
<?php if (! function_exists('calculate_queue_duration')) { /** * 计算歌曲队列总时长,返回格式化结果 * @param \Illuminate\Support\Collection $queueList 歌曲队列集合 * @param bool $withLeadingZero 是否输出分钟前导零 * @return string */ function calculate_queue_duration(\Illuminate\Support\Collection $queueList, bool $withLeadingZero = false): string { $totalSeconds = $queueList->sum(function ($song) { [$h, $i, $s] = explode(':', $song->duration); return $h * 3600 + $i * 60 + $s; }); $totalMinutes = floor($totalSeconds / 60); $remainSeconds = $totalSeconds % 60; return $withLeadingZero ? sprintf('%02d:%02d', $totalMinutes, $remainSeconds) : sprintf('%d:%02d', $totalMinutes, $remainSeconds); } }
- 在
composer.json的autoload.files节点添加"app/Helpers.php",执行composer dump-autoload后即可全局调用:
// 调用示例:输出无前导零格式 $totalDuration = calculate_queue_duration($queuelist); // 调用示例:输出带前导零格式 $totalDuration = calculate_queue_duration($queuelist, true);
内容的提问来源于stack exchange,提问作者JITZEH
相关产品推荐
相关产品推荐

