Home > Backend Development > Golang > 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
Release: 2024-02-09 19:00:11
forward
531 people have browsed it

在 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))
}
Copy after login

However, when I run it, it prints

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

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"
Copy after login

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))
}
Copy after login

I got the following output:

"2022-12-08T04:41:59Z"
2022-12-08T04:41:59Z
Copy after login

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!

Related labels:
source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template