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

