php小編新一今天要給大家介紹的是Go語言中的一個(gè)問題,即“Go 小時(shí)轉(zhuǎn)換算法未正確轉(zhuǎn)換”。在Go語言中,時(shí)間轉(zhuǎn)換是一個(gè)常見的操作,但是在某些情況下,小時(shí)轉(zhuǎn)換的結(jié)果可能會出現(xiàn)錯(cuò)誤。本文將詳細(xì)解釋這個(gè)問題的原因,并提供解決方案,幫助開發(fā)者避免在使用Go語言進(jìn)行時(shí)間轉(zhuǎn)換時(shí)出現(xiàn)錯(cuò)誤。
問題內(nèi)容
我遇到了一個(gè) hackerrank 挑戰(zhàn),我應(yīng)該構(gòu)建一個(gè)函數(shù),將給定時(shí)間格式的字符串從 12 小時(shí)格式轉(zhuǎn)換為 24 小時(shí)格式。
我設(shè)法使用下面的代碼做到了這一點(diǎn),但正如您所注意到的,晚上 9 點(diǎn)有一個(gè)特殊情況。每當(dāng)我輸入以 09 開頭的一個(gè)小時(shí)(只有這個(gè)該死的)時(shí),它會將 09 轉(zhuǎn)換為 12。所以我必須創(chuàng)建一個(gè)特定的案例來處理這個(gè)問題,這很有效,但我想了解為什么它發(fā)生了。你知道問題出在哪里嗎?
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")) }
登錄后復(fù)制
解決方法
如果您在字符串到 int 轉(zhuǎn)換過程中發(fā)現(xiàn)錯(cuò)誤,您會注意到對于值 >7
,轉(zhuǎn)換失敗
firstValueNumber, err := strconv.ParseInt(firstValue, 0, 64) if err != nil { fmt.Printf("%s", err.Error()) } // "08" results in invalid syntaxfirstValueNumber being printed
登錄后復(fù)制
發(fā)生這種情況是因?yàn)槟鷤鬟f 0 作為基數(shù),告訴 parseint
從字符串的第一個(gè)字符推斷基數(shù)。前導(dǎo) '0'
意味著八進(jìn)制基數(shù),因此大于 7 的數(shù)字將無效。相反,傳遞 10 就不需要特殊處理。