Maison  >  Article  >  développement back-end  >  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
Susan Sarandonoriginal
2024-11-05 08:25:02967parcourir

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

Format correct attendu :

2016-08-08T21:35:14.052975+02:00

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>

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>

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:
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