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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 12:51:16