首页 >后端开发 >Golang >如何在 Go 中解组格式不正确的日期时间字符串?

如何在 Go 中解组格式不正确的日期时间字符串?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-04 18:17:01340浏览

How to Unmarshal Incorrectly Formatted Datetime Strings in Go?

解组格式不正确的日期时间

背景

尝试在 Go 中解析日期时间字符串时使用 time.Parse 时,如果时区偏移量格式不正确,解析可能会失败。具体来说,如果按照 RFC3339 的要求将偏移量指定为“0200”而不是“02:00”。

问题

给定一组包含以下内容的 JSON 文件偏移量格式不正确的日期时间,我们如何在 Go 中正确地解组它们而不改变编组回的日期时间的格式JSON?

答案

自定义时间字段

要处理有效和无效的偏移格式,我们可以定义自己的自定义时间字段类型。这允许我们覆盖默认的解组行为,并根据两种预期格式之一手动解析日期时间字符串。

示例实现

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

func (self *MyTime) UnmarshalJSON(b []byte) (err error) {
    s := string(b)

    // Remove quotes from JSON string (optional)
    s = s[1:len(s)-1]

    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
}

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

在此示例中,我们使用 UnmarshalJSON 方法来覆盖默认的解组行为。我们首先删除日期时间字符串周围的所有引号,然后尝试使用标准 time.RFC3339Nano 格式对其进行解析。如果失败,我们也会尝试解析错误的格式(“2006-01-02T15:04:05.999999999Z0700”)。

JSON 元数据中的 RFC3339Nano 格式

指定使用 RFC3339Nano 格式JSON 中的自定义时间字段,我们可以简单地使用与 UnmarshalJSON 方法中相同的格式字符串:

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

这表示时间字段将在 JSON 中表示为 RFC3339Nano 格式的字符串。当封送回 JSON 时,将使用 MyTime 类型的重写 MarshalJSON 方法来确保保持正确的格式。

以上是如何在 Go 中解组格式不正确的日期时间字符串?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn