如何在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
相关产品推荐
相关产品推荐

