Go语言12小时转24小时格式算法异常:09PM转换错误排查
问题原因分析:09PM被错误转换为12的根源
你的代码处理09PM时出现错误的核心原因,在于字符串转数字的进制参数设置错误:
firstValueNumber, _ := strconv.ParseInt(firstValue, 0, 16)
这里strconv.ParseInt的第二个参数传了0,这个参数的规则是:
- 字符串以
0x开头时按十六进制解析 - 字符串以
0开头(非0x)时按八进制解析 - 其他情况按十进制解析
当输入为09时,由于以0开头,会被当作八进制处理,但八进制的有效数字只有0-7,9属于非法字符,此时ParseInt会返回错误。而你用_忽略了错误,导致firstValueNumber的默认值为0,后续执行firstValueNumber+12得到12,这就是09PM被错误转换为12的直接原因。
修正方案
把进制参数明确设置为10,强制按十进制解析,同时建议不要忽略解析错误:
func timeConversion(s string) string { var conversion Conversion firstValue := fmt.Sprintf("%s%s", string(s[0]), string(s[1])) secondValue := fmt.Sprintf("%s%s", string(s[3]), string(s[4])) // 改为十进制解析并处理错误 firstValueNumber, err := strconv.ParseInt(firstValue, 10, 64) if err != nil { return s } if strings.Contains(s, "A") { if firstValue == "12" { conversion.conversion = fmt.Sprintf("%s:%s:%s%s", "00", secondValue, string(s[len(s)-4]), string(s[len(s)-3])) } else { conversion.conversion = fmt.Sprintf("%s:%s:%s%s", firstValue, secondValue, string(s[len(s)-4]), string(s[len(s)-3])) } } else if strings.Contains(s, "P") { if firstValue == "12" { conversion.conversion = fmt.Sprintf("%s:%s:%s%s", "12", secondValue, string(s[len(s)-4]), string(s[len(s)-3])) } else { conversion.conversion = fmt.Sprintf("%d:%s:%s%s", firstValueNumber+12, secondValue, string(s[len(s)-4]), string(s[len(s)-3])) } } return conversion.conversion }
修正后,09会被正确解析为十进制的9,9+12=21,就能得到预期的21:08:23结果,同时可以去掉针对09的特殊处理分支。
内容的提问来源于stack exchange,提问作者Mateus Moreno
相关产品推荐
相关产品推荐

