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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 11:43:14