Home >Backend Development >Golang >How to Unmarshal Incorrectly Formatted Datetimes in Go?

How to Unmarshal Incorrectly Formatted Datetimes in Go?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-06 10:43:02282browse

How to Unmarshal Incorrectly Formatted Datetimes in Go?

Unmarshal Incorrectly Formatted Datetime

When unmarshaling JSON datetimes in Go, a common issue arises when the timezone offset provided in the JSON is incorrectly formatted. The expected format, according to RFC3339, is 02:00 with a colon, but some sources may output it as 0200 without the colon.

Custom Unmarshaling Solution

To handle this discrepancy, a customized time field type can be defined that supports both formats:

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

func (self *MyTime) UnmarshalJSON(b []byte) (err error) {
    s := string(b)
    s = s[1:len(s)-1] // Remove the quotes

    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>

This solution leverages the UnmarshalJSON method to first remove the quotes from the JSON string. Then, it tries to parse the datetime using the standard RFC3339Nano format. If that fails, it falls back to parsing a modified format that removes the colon from the timezone offset.

Struct Integration

To integrate this type into a struct, define it as:

<code class="go">type Test struct {
    Time MyTime `json:"time"`
}</code>

This allows JSON to be unmarshaled into a Test struct, with the Time field being filled with the correct date and time, regardless of whether the timezone offset is colon-separated or not.

Note on Time Format

The use of the year 2006 in the time format strings is a historical artifact from the initial release of Go. It has no practical significance and does not affect the correctness or formatting of datetimes.

The above is the detailed content of How to Unmarshal Incorrectly Formatted Datetimes in Go?. For more information, please follow other related articles on the PHP Chinese website!

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