Go语言中MM:SS格式字符串转time.Duration出错排查
解决MM:SS格式字符串转time.Duration的错误问题
你这段代码的问题出在用time.Parse解析时间后,拿它和time.Time{}零值做减法。time.Time{}的零值代表公元1年1月1日00:00:00 UTC,而time.Parse解析出的时间默认会套用这个年份,由于历史上的历法变更(比如儒略历转格里高利历),这个时间的实际偏移和你预期的分钟、秒数完全不符,因此得到了奇怪的负数结果。
正确的思路是直接拆分字符串中的分钟和秒,转换成整数后计算对应的duration:
package main import ( "fmt" "strconv" "strings" "time" ) func parseDuration(input string) (time.Duration, error) { parts := strings.Split(input, ":") var mins, secs int var err error switch len(parts) { case 2: mins, err = strconv.Atoi(parts[0]) if err != nil { return 0, err } secs, err = strconv.Atoi(parts[1]) if err != nil { return 0, err } case 3: // 兼容HH:MM:SS格式 hours, err := strconv.Atoi(parts[0]) if err != nil { return 0, err } mins, err = strconv.Atoi(parts[1]) if err != nil { return 0, err } secs, err = strconv.Atoi(parts[2]) if err != nil { return 0, err } return time.Duration(hours)*time.Hour + time.Duration(mins)*time.Minute + time.Duration(secs)*time.Second, nil default: return 0, fmt.Errorf("invalid duration format: %s", input) } return time.Duration(mins)*time.Minute + time.Duration(secs)*time.Second, nil } func main() { input := "00:04" duration, err := parseDuration(input) if err != nil { fmt.Println(err) return } fmt.Println(int(duration.Seconds())) // 输出4,符合预期 }
这种方法直接处理时间分量,完全规避了time.Parse带来的历史时间基准问题,结果准确可控,同时也兼容HH:MM:SS的格式需求。
内容的提问来源于stack exchange,提问作者Trewq
相关产品推荐
相关产品推荐

