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

如何将格式为2:30的时长数组求和并转换为分钟/小时格式?

解决时长数组求和并格式化输出的问题

我来帮你搞定这个时长求和的需求!你之前尝试的代码无效,主要有两个原因:一是array_sum只能对数值数组求和,而你从数据库获取的是包含整行数据的数组;二是length字段是字符串格式的时长(比如2:30),没法直接参与数值计算。下面是具体的实现方案:

步骤1:计算总时长(转换为秒数求和)

首先我们需要把每个字符串格式的时长转换成秒数,然后累加得到总秒数,这样后续的格式转换会更方便:

// 从数据库获取所有歌曲的时长字段
$songs = $db->super_query("SELECT length FROM mixes_songs WHERE collectionId = '$albumId'");

$totalSeconds = 0;
foreach ($songs as $song) {
    // 拆分时长字符串(格式为 mm:ss,比如"2:30")
    list($minutes, $seconds) = explode(':', $song['length']);
    // 转换成秒数并累加
    $totalSeconds += (int)$minutes * 60 + (int)$seconds;
}

注意:如果你的时长格式是hh:mm(时:分),只需要把计算逻辑改成:
$totalSeconds += (int)$hours * 3600 + (int)$minutes * 60;

步骤2:将总秒数转换成小时+分钟的格式

接下来把总秒数转换成你需要的小时和分钟格式:

// 计算总小时数
$totalHours = floor($totalSeconds / 3600);
// 计算剩余秒数(去掉整小时后的部分)
$remainingSeconds = $totalSeconds % 3600;
// 计算剩余分钟数
$totalMinutes = floor($remainingSeconds / 60);

步骤3:格式化输出字符串

最后根据小时和分钟的数值,生成符合要求的输出格式:

$durationOutput = '';

if ($totalHours > 0) {
    $durationOutput .= "{$totalHours}hr";
    // 如果还有剩余分钟,加上分钟部分
    if ($totalMinutes > 0) {
        $durationOutput .= " {$totalMinutes} mins";
    }
} else {
    $durationOutput .= "{$totalMinutes} MINS";
}

// 输出结果,比如总时长5分19秒会输出"5 MINS",总时长1小时5分会输出"1hr 5 mins"
echo $durationOutput;

为什么原代码无效?

再回头看你之前的代码:

$length = $db->super_query("SELECT * FROM mixes_songs WHERE collectionId = '$albumId'");
$row['length'] = array_sum($length);
  • $length是数据库返回的多条记录的数组,每个元素是包含所有字段的关联数组,array_sum无法直接对这种数组求和;
  • 即使你只取length字段,它也是字符串类型,array_sum会把字符串转换成0,所以结果肯定不对。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:05:28