Algoritma penukaran Go hour tidak menukar dengan betul

WBOY
Lepaskan: 2024-02-14 10:00:09
ke hadapan
770 orang telah melayarinya

Go 小时转换算法未正确转换

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.

Kandungan soalan

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"))
}
Salin selepas log masuk

Penyelesaian

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
Salin selepas log masuk

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!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan