Maison > développement back-end > Golang > Comment désorganiser JSON avec un décalage de fuseau horaire incorrect dans Go ?

Comment désorganiser JSON avec un décalage de fuseau horaire incorrect dans Go ?

Susan Sarandon
Libérer: 2024-11-05 08:25:02
original
1071 Les gens l'ont consulté

How to Unmarshal JSON with Incorrect Timezone Offset in Go?

Format date/heure non valide dans le démarshalling JSON

Arrière-plan

Le démarshaling JSON de Go présente des problèmes avec les dates et heures formatées selon la norme ISO8601/RFC3339 qui ont des décalages de fuseau horaire dans le format 0200 au lieu de 02h00.

Problème

Format JSON incorrect :

2016-08-08T21:35:14.052975+0200
Copier après la connexion

Format correct attendu :

2016-08-08T21:35:14.052975+02:00
Copier après la connexion

Cause possible :

Le JSON a été généré à l'aide de la fonction strftime de C avec une chaîne de format qui n'inclut pas les deux-points dans le décalage du fuseau horaire.

Solution

Pour résoudre ce problème et permettre la désorganisation correcte des deux formats, un type de champ d'heure personnalisé peut être défini :

<code class="go">type MyTime struct {
    time.Time
}

func (self *MyTime) UnmarshalJSON(b []byte) (err error) {
    s := string(b)

    // Remove double quotes from JSON value
    s = s[1:len(s)-1]

    t, err := time.Parse(time.RFC3339Nano, s)
    if err != nil {
        t, err = time.Parse("2006-01-02T15:04:05.999999999Z0700", s)
    }
    self.Time = t
    return
}</code>
Copier après la connexion

Dans ce type personnalisé, la méthode UnmarshalJSON tente pour analyser la chaîne selon à la fois la RFC3339Nano (avec deux points dans le décalage du fuseau horaire) et une version modifiée de RFC3339Nano sans les deux-points.

Utilisation

Pour utiliser le type de champ d'heure personnalisé :

<code class="go">type Test struct {
    Time MyTime `json:"time"`
}</code>
Copier après la connexion

Cette structure peut ensuite être désorganisée à partir de l'un ou l'autre format JSON avec le décalage de fuseau horaire incorrect ou correct.

Notes

  • Par défaut, le format RFC3339Nano dans le temps. Parse utilise "Z" pour le décalage du fuseau horaire, tandis que dans le format modifié, "Z0700" est utilisé.
  • L'année "2006" dans le format horaire est une référence à la première année de sortie de Go.

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 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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal