Maison >développement back-end >Golang >Comment convertir l'heure en UTC avant de la convertir en JSON dans Go ?

Comment convertir l'heure en UTC avant de la convertir en JSON dans Go ?

WBOY
WBOYavant
2024-02-09 19:00:11553parcourir

在 Go 中将时间编组为 JSON 之前如何将时间转换为 UTC?

En langage Go, avant de convertir l'heure en UTC, nous pouvons utiliser les fonctions et méthodes fournies dans le package time pour la traiter. Tout d’abord, nous pouvons utiliser la fonction time.Now() pour obtenir l’heure locale actuelle. Ensuite, utilisez la fonction time.LoadLocation("UTC") pour charger le fuseau horaire UTC. Ensuite, utilisez la méthode time.In() pour convertir l’heure locale en heure UTC. Enfin, utilisez la méthode time.Format() pour formater l'heure UTC dans le format de chaîne dont nous avons besoin. De cette façon, nous pouvons convertir l’heure en UTC et effectuer des traitements et opérations ultérieurs.

Contenu de la question

J'essaie de définir une représentation au format time 结构,它实现 marshaler 接口,这样,当它被编组为 json 时,它以 yyyy-mm-ddthh:mm:ssz où l'heure est convertie en utc et arrondie à la seconde la plus proche. J'ai essayé les procédures suivantes :

package main

import (
    "encoding/json"
    "fmt"
    "log"
    "time"
)

type time struct {
    time.time
}

func (t *time) marshaljson() ([]byte, error) {
    return []byte(t.time.utc().round(time.second).format(time.rfc3339)), nil
}

func main() {
    tm := time.now()
    // tm := time.now().utc().round(time.second)

    tmjson, err := json.marshal(tm)
    if err != nil {
        log.fatalf("marshal time: %v", err)
    }

    fmt.println(string(tmjson))
}

Mais quand je l'exécute, il s'imprime

> go run main.go
"2022-12-07t16:32:51.494597-08:00"

En revanche, si je passe time.now().utc().round(time.second) comme entrée à marshaler (c'est-à-dire en utilisant la ligne commentée dans l'extrait ci-dessus), j'obtiens le résultat souhaité :

> go run main.go
"2022-12-08T00:41:10Z"

Ma question est la suivante : pourquoi ne puis-je pas effectuer la conversion en utc et arrondir à la seconde la plus proche dans la méthode marshaljson elle-même ?

Solution

Que veux-tu faire ?

J'ai essayé d'exécuter votre fonction marshaljson et cela a fonctionné comme prévu

Voici ce que j'ai essayé de faire :

package main

import (
    "encoding/json"
    "fmt"
    "log"
    "time"
)

type time struct {
    time.time
}

func (t *time) marshaljson() ([]byte, error) {
    return []byte(t.time.utc().round(time.second).format(time.rfc3339)), nil
}

func main() {
    // tm := time.now().utc()
    tm := time.now().utc().round(time.second)

    tmjson, err := json.marshal(tm)
    if err != nil {
        log.fatalf("marshal time: %v", err)
    }

    fmt.println(string(tmjson))

    marshal_time := time{time.now().utc()}
    byt_arr, _ := marshal_time.marshaljson()
    fmt.println(string(byt_arr))
}

J'ai obtenu le résultat suivant :

"2022-12-08T04:41:59Z"
2022-12-08T04:41:59Z

La première ligne est votre sortie précédente et la deuxième ligne est la sortie de la fonction marshaljson.

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer