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

如何在Go语言中解析35:46、01:04:20这类音频时间戳?

在Go中解析hh:mm:ss或mm:ss格式的时间戳

我正在开发一个控制MPD(Music Player Daemon)的Go程序,用来播放长音频文件里的特定曲目。项目的YAML配置包含曲目标题和对应的起始时间,示例如下:

  • title: Toshiki Kadomatsu - Airport Lady
    time: 35:46
  • title: Yellow Magic Orchestra - Technopolis
    time: 39:58

目前我通过获取time值执行mpc seek 35:46实现跳转,但现在需要显示当前播放的曲目——计划把MPD返回的已播放秒数(比如1239.324)转成时长,再和YAML里的曲目时间对比。但time.ParseDuration无法直接解析35:46这种格式,替换冒号为m加s的方法又处理不了01:04:20这种跨小时的格式,该怎么解决?

解决方案:手动拆分时间字符串计算总秒数

直接根据时间字符串中冒号的数量,判断是mm:ss还是hh:mm:ss格式,拆分后计算总秒数,这样既兼容两种格式,又能得到可与MPD返回值对比的数值:

import (
    "fmt"
    "strconv"
    "strings"
)

// parseTimeStr 将 mm:ss 或 hh:mm:ss 格式的字符串转换为总秒数
func parseTimeStr(timeStr string) (float64, error) {
    parts := strings.Split(timeStr, ":")
    var totalSeconds float64

    switch len(parts) {
    case 2: // 处理 mm:ss 格式
        minutes, err := strconv.ParseFloat(parts[0], 64)
        if err != nil {
            return 0, fmt.Errorf("invalid minutes: %w", err)
        }
        seconds, err := strconv.ParseFloat(parts[1], 64)
        if err != nil {
            return 0, fmt.Errorf("invalid seconds: %w", err)
        }
        totalSeconds = minutes*60 + seconds
    case 3: // 处理 hh:mm:ss 格式
        hours, err := strconv.ParseFloat(parts[0], 64)
        if err != nil {
            return 0, fmt.Errorf("invalid hours: %w", err)
        }
        minutes, err := strconv.ParseFloat(parts[1], 64)
        if err != nil {
            return 0, fmt.Errorf("invalid minutes: %w", err)
        }
        seconds, err := strconv.ParseFloat(parts[2], 64)
        if err != nil {
            return 0, fmt.Errorf("invalid seconds: %w", err)
        }
        totalSeconds = hours*3600 + minutes*60 + seconds
    default:
        return 0, fmt.Errorf("unsupported time format: %s", timeStr)
    }

    return totalSeconds, nil
}

使用示例

// 解析 mm:ss 格式
sec1, _ := parseTimeStr("35:46")
fmt.Println(sec1) // 输出 2146.0

// 解析 hh:mm:ss 格式
sec2, _ := parseTimeStr("01:04:20")
fmt.Println(sec2) // 输出 3860.0

得到总秒数后,就可以直接和MPD返回的已播放秒数(如1239.324)对比,判断当前播放的是哪首曲目。

额外:将秒数转回可读时间格式

如果需要把MPD返回的秒数转成hh:mm:ss或mm:ss格式用于显示,可以用这个辅助函数:

import "fmt"

// secondsToTimeStr 将总秒数转换为 hh:mm:ss.ms 或 mm:ss.ms 格式的字符串
func secondsToTimeStr(totalSeconds float64) string {
    totalInt := int(totalSeconds)
    hours := totalInt / 3600
    remaining := totalInt % 3600
    minutes := remaining / 60
    seconds := remaining % 60
    milliseconds := int((totalSeconds - float64(totalInt)) * 1000)

    if hours > 0 {
        return fmt.Sprintf("%02d:%02d:%02d.%03d", hours, minutes, seconds, milliseconds)
    }
    return fmt.Sprintf("%02d:%02d.%03d", minutes, seconds, milliseconds)
}
// 示例
fmt.Println(secondsToTimeStr(1239.324)) // 输出 20:39.324
fmt.Println(secondsToTimeStr(3860.5))   // 输出 01:04:20.500

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 16:52:55