Go算法无法正确转换小时



我遇到了一个HackerRank挑战,我应该构建一个函数,该函数以给定的12小时格式到24小时格式的时间字符串为参数。

我设法用下面的代码做到了这一点,但是正如你可以注意到的,有一个特殊的情况是在晚上9点。每当我输入一个以09开头的小时(只有这个该死的),它就会把09转换成12。所以我必须创建一个特殊的案例来处理它,这是可行的,但我想知道为什么会发生。你知道可能是什么问题吗?

package main
import (
"fmt"
"strconv"
"strings"
)
type Conversion struct {
conversion string
}
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, _ := strconv.ParseInt(firstValue, 0, 16)
fmt.Print()
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 if firstValue == "09" {
conversion.conversion = fmt.Sprintf("%s:%s:%s%s", "21", 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
}
func main() {
fmt.Print(timeConversion("09:08:23PM"))
}

如果在将字符串转换为int时捕获错误,您将注意到对于值>7,转换失败

firstValueNumber, err := strconv.ParseInt(firstValue, 0, 64)
if err != nil {
fmt.Printf("%s", err.Error())
}
// "08" results in invalid syntaxfirstValueNumber being printed

这是因为您传递0作为基数,告诉parseInt从字符串的第一个字符推断基数。前导'0'表示八进制基数,因此大于7的数字无效。而传递10则不需要特殊处理。

最新更新