Heim > Backend-Entwicklung > Golang > Warum kann „time.Parse' von Go Zeitzonen nicht genau analysieren, und wie kann das behoben werden?

Warum kann „time.Parse' von Go Zeitzonen nicht genau analysieren, und wie kann das behoben werden?

Mary-Kate Olsen
Freigeben: 2024-11-27 17:55:11
Original
386 Leute haben es durchsucht

Why Does Go's `time.Parse` Fail to Accurately Parse Time Zones, and How Can This Be Fixed?

Grundlegendes zum Parsen von Zeitzonen in Go

Das Parsen von Zeitzonencodes in Go umfasst die Konvertierung einer Zeichenfolgendarstellung einer Zeitzone in eine entsprechende *Zeit .Location-Objekt. In bestimmten Szenarien spiegelt das analysierte Ergebnis jedoch möglicherweise nicht genau die gewünschte Zeitzone wider. Dieser Artikel untersucht ein häufiges Problem beim Parsen von Zeitzonen und bietet Lösungen.

Problemformulierung

Beachten Sie den folgenden Code:

package main

import (
    "fmt"
    "time"
)

func main() {
    now := time.Now()
    parseAndPrint(now, "BRT")
    parseAndPrint(now, "EDT")
    parseAndPrint(now, "UTC")
}

func parseAndPrint(now time.Time, timezone string) {
    test, err := time.Parse("15:04:05 MST", fmt.Sprintf("05:00:00 %s", timezone))
    if err != nil {
        fmt.Println(err)
        return
    }

    test = time.Date(
        now.Year(),
        now.Month(),
        now.Day(),
        test.Hour(),
        test.Minute(),
        test.Second(),
        test.Nanosecond(),
        test.Location(),
    )

    fmt.Println(test.UTC())
}
Nach dem Login kopieren

Beim Ausführen Mit diesem Code zeigt die Ausgabe unabhängig von der angegebenen Zeitzone immer „[Datum] 05:00:00 0000 UTC“ an. Dies liegt daran, dass der Code die Zeit am aktuellen Standort analysiert und dann die Zeitzone explizit auf UTC setzt.

Lösung: Verwendung von time.Location

Zur korrekten Handhabung Beim Parsen der Zeitzone müssen wir den Typ *time.Location verwenden. Wir können mit time.LoadLocation einen Ort aus der lokalen Zeitzonendatenbank laden und dann die Zeit mit time.ParseInLocation analysieren. Hier ist der geänderte Code:

package main

import (
    "fmt"
    "time"
)

func main() {
    now := time.Now()
    parseAndPrint(now, "BRT")
    parseAndPrint(now, "EDT")
    parseAndPrint(now, "UTC")
}

func parseAndPrint(now time.Time, timezone string) {
    location, err := time.LoadLocation(timezone)
    if err != nil {
        fmt.Println(err)
        return
    }

    test, err := time.ParseInLocation("15:04:05 MST", "05:00:00", location)
    if err != nil {
        fmt.Println(err)
        return
    }

    fmt.Println(test)
}
Nach dem Login kopieren

Jetzt analysiert der Code die Zeitzonen-spezifische Zeit korrekt und gibt das Ergebnis im gewünschten Zeitzonenformat aus.

Das obige ist der detaillierte Inhalt vonWarum kann „time.Parse' von Go Zeitzonen nicht genau analysieren, und wie kann das behoben werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage