Maison >développement back-end >Golang >Pourquoi l'ajout d'un décalage UTC à l'heure UTC ne produit-il pas avec précision l'heure locale en Go ?

Pourquoi l'ajout d'un décalage UTC à l'heure UTC ne produit-il pas avec précision l'heure locale en Go ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-21 16:18:10524parcourir

Why Does Adding a UTC Offset to UTC Time Not Accurately Produce Local Time in Go?

Problèmes de conversion de l'heure UTC en heure locale dans Go

Aperçu du problème

Lors de la tentative de conversion de l'heure UTC en heure locale, certains utilisateurs rencontrent des résultats incorrects. Plus précisément, le problème survient lors de l'ajout d'une durée, calculée à partir d'un décalage UTC fourni, à l'heure UTC actuelle. Cette valeur renvoyée s'écarte de l'heure locale prévue.

Approche initiale

L'extrait de code initialise une carte contenant les décalages UTC pour différents pays. Il tente de convertir le décalage de « Hongrie » en une durée, en l'ajoutant à l'heure UTC, et affiche le résultat sous la forme « heure locale ».

package main

import "fmt"
import "time"

func main() {

    m := make(map[string]string)
    m["Hungary"] = "+01.00h"

    offSet, err := time.ParseDuration(m["Hungary"])
    if err != nil {
        panic(err)
    }
    t := time.Now().UTC().Add(offSet)
    nice := t.Format("15:04")

    fmt.Println(nice)
}

Résultats incorrects

Lors de son exécution, le code produit des heures locales incorrectes, notamment pour les pays avec un décalage par rapport à UTC. Par exemple, avec le décalage d'une heure en Hongrie, le résultat ne reflète pas l'heure locale réelle.

Cause fondamentale

Les résultats incorrects proviennent de l'hypothèse selon laquelle le L’heure UTC ajustée est équivalente à l’heure locale. Cependant, cette hypothèse ne tient pas compte du concept de fuseaux horaires.

Considérations sur les fuseaux horaires

Les fuseaux horaires sont des régions géographiques qui observent une heure standard à des fins juridiques, commerciales et sociales. . Différents fuseaux horaires ont leurs propres décalages par rapport à UTC, représentant la différence de temps par rapport au méridien d'origine.

Approche correcte

Pour convertir avec précision l'heure UTC en une heure locale spécifique, il est essentiel de prendre en compte le fuseau horaire associé à cet emplacement. La fonction time.LoadLocation permet d'obtenir un objet fuseau horaire en fonction de son identifiant de chaîne.

var countryTz = map[string]string{
    "Hungary": "Europe/Budapest",
    "Egypt":   "Africa/Cairo",
}

func timeIn(name string) time.Time {
    loc, err := time.LoadLocation(countryTz[name])
    if err != nil {
        panic(err)
    }
    return time.Now().In(loc)
}

func main() {
    utc := time.Now().UTC().Format("15:04")
    hun := timeIn("Hungary").Format("15:04")
    eg := timeIn("Egypt").Format("15:04")
    fmt.Println(utc, hun, eg)
}

Cette solution garantit que l'heure convertie reflète l'heure locale du pays spécifié, en tenant compte de l'heure pertinente zone.

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!

Déclaration:
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