Heim >Backend-Entwicklung >Golang >Der Go-Stunden-Umrechnungsalgorithmus konvertiert nicht korrekt

Der Go-Stunden-Umrechnungsalgorithmus konvertiert nicht korrekt

WBOY
WBOYnach vorne
2024-02-14 10:00:09800Durchsuche

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

Was der PHP-Editor Xinyi Ihnen heute vorstellen wird, ist ein Problem in der Go-Sprache, nämlich „Der Go-Stundenkonvertierungsalgorithmus wird nicht korrekt konvertiert“. In der Go-Sprache ist die Zeitumrechnung ein üblicher Vorgang, aber in einigen Fällen kann das Ergebnis der Stundenumrechnung falsch sein. In diesem Artikel wird die Ursache dieses Problems ausführlich erläutert und Lösungen bereitgestellt, die Entwicklern helfen, Fehler bei der Verwendung der Go-Sprache zur Zeitkonvertierung zu vermeiden.

Frageninhalt

Ich bin auf eine Hackerrank-Challenge gestoßen, bei der ich eine Funktion erstellen sollte, die einen String in einem bestimmten Zeitformat vom 12-Stunden-Format in das 24-Stunden-Format konvertiert.

Ich habe dies mit dem folgenden Code geschafft, aber wie Sie bemerkt haben, gibt es um 21 Uhr einen Sonderfall. Immer wenn ich eine Stunde eingebe, die mit 09 beginnt (das ist das einzig Verdammte), wird 09 in 12 umgewandelt. Also musste ich einen speziellen Fall erstellen, um dieses Problem zu lösen, was funktionierte, aber ich wollte verstehen, warum es passiert ist. Wissen Sie, was das Problem ist?

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"))
}

Workaround

Wenn Sie bei der Konvertierung von String in Int einen Fehler finden, werden Sie feststellen, dass die Konvertierung für den Wert >7 fehlschlägt

firstValueNumber, err := strconv.ParseInt(firstValue, 0, 64)
if err != nil {
     fmt.Printf("%s", err.Error())
}
// "08" results in invalid syntaxfirstValueNumber being printed

Dies geschieht, weil Sie 0 als Basis übergeben und parseint 从字符串的第一个字符推断基数。前导 '0' mitteilen, dass es sich um eine Oktalbasis handelt, sodass Zahlen größer als 7 nicht gültig sind. Im Gegensatz dazu erfordert das Bestehen von 10 keine besondere Behandlung.

Das obige ist der detaillierte Inhalt vonDer Go-Stunden-Umrechnungsalgorithmus konvertiert nicht korrekt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen