php小编新一今天要给大家介绍的是Go语言中的一个问题,即“Go 小时转换算法未正确转换”。在Go语言中,时间转换是一个常见的操作,但是在某些情况下,小时转换的结果可能会出现错误。本文将详细解释这个问题的原因,并提供解决方案,帮助开发者避免在使用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 就不需要特殊处理。
以上就是Go 小时转换算法未正确转换的详细内容,更多请关注编程网其它相关文章!