Maison > développement back-end > Golang > Pourquoi « time.Parse » de Go ne parvient-il pas à analyser avec précision les fuseaux horaires, et comment cela peut-il être corrigé ?

Pourquoi « time.Parse » de Go ne parvient-il pas à analyser avec précision les fuseaux horaires, et comment cela peut-il être corrigé ?

Mary-Kate Olsen
Libérer: 2024-11-27 17:55:11
original
387 Les gens l'ont consulté

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

Comprendre l'analyse du fuseau horaire dans Go

L'analyse des codes de fuseau horaire dans Go implique la conversion d'une représentation sous forme de chaîne d'un fuseau horaire en une *heure correspondante .Objet de localisation. Toutefois, dans certains scénarios, le résultat analysé peut ne pas refléter avec précision le fuseau horaire souhaité. Cet article explore un problème courant dans l'analyse des fuseaux horaires et propose des solutions.

Formulation du problème

Considérez le code suivant :

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())
}
Copier après la connexion

Lors de l'exécution ce code, la sortie affiche toujours "[date] 05:00:00 0000 UTC", quel que soit le fuseau horaire spécifié. En effet, le code analyse l'heure à l'emplacement actuel, puis définit explicitement le fuseau horaire sur UTC.

Solution : utiliser time.Location

Pour gérer correctement Pour l'analyse du fuseau horaire, nous devons utiliser le type *time.Location. Nous pouvons charger un emplacement à partir de la base de données de fuseau horaire local en utilisant time.LoadLocation, puis analyser l'heure en utilisant time.ParseInLocation. Voici le code modifié :

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)
}
Copier après la connexion

Maintenant, le code analysera correctement l'heure spécifique au fuseau horaire et imprimera le résultat dans le format de fuseau horaire souhaité.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal