Home  >  Article  >  Backend Development  >  How to convert time to UTC before marshalling it to JSON in Go?

How to convert time to UTC before marshalling it to JSON in Go?

WBOY
WBOYforward
2024-02-09 19:00:11486browse

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

In the Go language, before converting time to UTC, we can use the functions and methods provided in the time package to process it. First, we can use the time.Now() function to get the current local time. Then, use the time.LoadLocation("UTC") function to load the UTC time zone. Next, use the time.In() method to convert local time to UTC time. Finally, use the time.Format() method to format the UTC time into the string format we need. In this way, we can convert the time to UTC and perform subsequent processing and operations.

Question content

I am trying to define a time structure that implements the marshaler interface so that when it is marshaled to json, it ends with yyyy-mm-ddthh:mm:ssz Format representation, that is, the time is converted to UTC and rounded to the nearest second. I have tried the following procedures:

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))
}

However, when I run it, it prints

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

In contrast, if I pass in time.now().utc().round(time.second) as the input to be marshaled (i.e., using the comments in the snippet above line), I get the desired output:

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

My question is: Why can't I perform the conversion to utc and round to the nearest second in the marshaljson method itself?

Solution

What do you want to do?

I tried running your marshaljson function and it worked as expected

This is what I tried to do:

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))
}

I got the following output:

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

The first line is your previous output, the second line is the output of the marshaljson function.

The above is the detailed content of How to convert time to UTC before marshalling it to JSON in Go?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete