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

Go语言实现支持可选小时的时间格式转秒功能

Go语言实现支持两种时间格式转秒的功能

原代码的问题在于ConvertTimeFormat函数仅使用了%d:%d:%d的扫描格式,只能匹配带小时的HH:MM:SS格式,遇到不带小时的MM:SS格式时,fmt.Sscanf无法匹配成功,导致返回错误。

下面提供两种可行的修改方案:

方案一:尝试两种格式的扫描

先尝试解析带小时的格式,失败后再尝试解析不带小时的格式:

package main

import (
    "fmt"
)

func main() {
    t1 := "01:30"
    seconds, err := ConvertTimeFormat(t1)
    if err != nil {
        fmt.Println("错误:", err)
    } else {
        fmt.Println(seconds) // 输出90
    }

    t2 := "01:01:15"
    second, err := ConvertTimeFormat(t2)
    if err != nil {
        fmt.Println("错误:", err)
    } else {
        fmt.Println(second) // 输出3675
    }
}

func ConvertTimeFormat(st string) (int, error) {
    var h, m, s int
    // 优先匹配HH:MM:SS格式
    n, err := fmt.Sscanf(st, "%d:%d:%d", &h, &m, &s)
    if err == nil && n == 3 {
        return h*3600 + m*60 + s, nil
    }
    // 匹配失败则尝试MM:SS格式
    n, err = fmt.Sscanf(st, "%d:%d", &m, &s)
    if err == nil && n == 2 {
        return m*60 + s, nil
    }
    // 两种格式都不匹配时返回错误
    return 0, fmt.Errorf("无效的时间格式:%s", st)
}

这种方法利用fmt.Sscanf的特性,依次尝试两种格式的解析,逻辑简洁易懂,适合格式固定的场景。

方案二:分割字符串后处理

通过strings.Split将时间字符串按冒号分割,根据分割后的元素数量判断格式类型:

package main

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

func main() {
    t1 := "01:30"
    seconds, err := ConvertTimeFormat(t1)
    if err != nil {
        fmt.Println("错误:", err)
    } else {
        fmt.Println(seconds) // 输出90
    }

    t2 := "01:01:15"
    second, err := ConvertTimeFormat(t2)
    if err != nil {
        fmt.Println("错误:", err)
    } else {
        fmt.Println(second) // 输出3675
    }
}

func ConvertTimeFormat(st string) (int, error) {
    parts := strings.Split(st, ":")
    switch len(parts) {
    case 2:
        // 处理MM:SS格式
        m, err := strconv.Atoi(parts[0])
        if err != nil {
            return 0, err
        }
        s, err := strconv.Atoi(parts[1])
        if err != nil {
            return 0, err
        }
        return m*60 + s, nil
    case 3:
        // 处理HH:MM:SS格式
        h, err := strconv.Atoi(parts[0])
        if err != nil {
            return 0, err
        }
        m, err := strconv.Atoi(parts[1])
        if err != nil {
            return 0, err
        }
        s, err := strconv.Atoi(parts[2])
        if err != nil {
            return 0, err
        }
        return h*3600 + m*60 + s, nil
    default:
        return 0, fmt.Errorf("无效的时间格式:%s", st)
    }
}

这种方法更灵活,能明确处理不同分割长度的情况,还能单独校验每个时间部分的数字有效性,适合需要更细致错误处理的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 02:45:49