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

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项目中封装为公共辅助函数:

  1. 新建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);
    }
}
  1. 在composer.json的autoload.files节点添加"app/Helpers.php",执行composer dump-autoload后即可全局调用:
// 调用示例:输出无前导零格式
$totalDuration = calculate_queue_duration($queuelist);
// 调用示例:输出带前导零格式
$totalDuration = calculate_queue_duration($queuelist, true);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 00:36:09