"If a worker wants to do his job well, he must first sharpen his tools." - Confucius, "The Analects of Confucius. Lu Linggong"
Front page > Programming > How to Unmarshal Incorrectly Formatted Datetimes in Go?

How to Unmarshal Incorrectly Formatted Datetimes in Go?

Published on 2024-11-09
Browse:819

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:

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
}

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:

type Test struct {
    Time MyTime `json:"time"`
}

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.

Latest tutorial More>

Disclaimer: All resources provided are partly from the Internet. If there is any infringement of your copyright or other rights and interests, please explain the detailed reasons and provide proof of copyright or rights and interests and then send it to the email: [email protected] We will handle it for you as soon as possible.

Copyright© 2022 湘ICP备2022001581号-3