Apa yang akan diperkenalkan oleh editor PHP Xinyi kepada anda hari ini ialah masalah dalam bahasa Go, iaitu, "Algoritma penukaran jam Go tidak ditukar dengan betul". Dalam bahasa Go, penukaran masa ialah operasi biasa, tetapi dalam sesetengah kes, hasil penukaran jam mungkin salah. Artikel ini akan menerangkan punca masalah ini secara terperinci dan menyediakan penyelesaian untuk membantu pembangun mengelakkan ralat apabila menggunakan bahasa Go untuk penukaran masa.
Saya terjumpa cabaran peringkat penggodam di mana saya sepatutnya membina fungsi yang menukar rentetan dalam format masa tertentu daripada format 12 jam kepada format 24 jam.
Saya berjaya melakukan ini menggunakan kod di bawah, tetapi seperti yang anda perhatikan, terdapat kes khas pada pukul 9 malam. Setiap kali saya memasukkan satu jam yang bermula dengan 09 (itu satu-satunya perkara yang sialan), ia menukar 09 kepada 12. Jadi saya terpaksa mencipta kes khusus untuk menangani isu ini, yang berjaya, tetapi saya ingin memahami mengapa ia berlaku. Adakah anda tahu apa masalahnya?
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")) }
Jika anda mendapati ralat semasa penukaran rentetan kepada int, anda akan perasan bahawa untuk nilai >7
, penukaran gagal
firstValueNumber, err := strconv.ParseInt(firstValue, 0, 64) if err != nil { fmt.Printf("%s", err.Error()) } // "08" results in invalid syntaxfirstValueNumber being printed
Ini berlaku kerana anda melepasi 0 sebagai asas, memberitahu parseint
从字符串的第一个字符推断基数。前导 '0'
bermaksud asas perlapanan, jadi nombor yang lebih besar daripada 7 tidak akan sah. Sebaliknya, melepasi 10 tidak memerlukan pengendalian khas.
Atas ialah kandungan terperinci Algoritma penukaran Go hour tidak menukar dengan betul. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!