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 格式解组该结构。
以上是如何在 Go 中解组具有不正确时区偏移的 JSON?的详细内容。更多信息请关注PHP中文网其他相关文章!