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 小時轉換演算法未正確轉換的詳細內容。更多資訊請關注PHP中文網其他相關文章!