首页  >  文章  >  后端开发  >  如何在 Go 中解组具有不正确时区偏移的 JSON?

如何在 Go 中解组具有不正确时区偏移的 JSON?

Susan Sarandon
Susan Sarandon原创
2024-11-05 08:25:02908浏览

How to Unmarshal JSON with Incorrect Timezone Offset in Go?

JSON 解组中的无效日期时间格式

背景

Go 的 JSON 解组存在根据 ISO8601/RFC3339 格式化的日期时间问题,这些日期时间在格式 0200 而不是 02:00。

问题

JSON 格式不正确:

2016-08-08T21:35:14.052975+0200

预期正确格式:

2016-08-08T21:35:14.052975+02:00

可能的原因:

JSON 是使用 C 的 strftime 函数生成的,其格式字符串不包含时区偏移中的冒号。

解决方案

要解决此问题并启用两种格式的正确解组,可以定义自定义时间字段类型:

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

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

    // Remove double quotes from JSON value
    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
}</code>

在此自定义类型中,UnmarshalJSON 方法尝试根据 RFC3339Nano(时区偏移量中带有冒号)和不带冒号的 RFC3339Nano 修改版本来解析字符串。

用法

要使用自定义时间字段类型:

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

然后可以使用不正确或正确的时区偏移量从 JSON 格式解组该结构。

注释

  • 默认情况下,时间为 RFC3339Nano 格式。 Parse 使用“Z”作为时区偏移量,而在修改后的格式中,使用“Z0700”。
  • 时间格式中的年份“2006”是指 Go 发布的第一年。

以上是如何在 Go 中解组具有不正确时区偏移的 JSON?的详细内容。更多信息请关注PHP中文网其他相关文章!

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