解组格式错误的日期时间
在 Go 中解组 JSON 日期时间时,当 JSON 中提供的时区偏移格式不正确时,会出现一个常见问题。根据 RFC3339,预期格式是带冒号的 02:00,但某些源可能将其输出为不带冒号的 0200。
自定义解组解决方案
To为了处理这种差异,可以定义支持两种格式的自定义时间字段类型:
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
}
此解决方案利用 UnmarshalJSON 方法首先从 JSON 字符串中删除引号。然后,它尝试使用标准 RFC3339Nano 格式解析日期时间。如果失败,它会回退到解析修改后的格式,从时区偏移量中删除冒号。
结构集成
要将此类型集成到结构中,请定义它为:
type Test struct {
Time MyTime `json:"time"`
}
这允许将 JSON 解组到 Test 结构中,并用正确的日期和时间填充 Time 字段,无论时区偏移量是否以冒号分隔。
关于时间格式的注意事项
时间格式字符串中使用 2006 年是 Go 最初版本的历史产物。它没有实际意义,不会影响日期时间的正确性或格式。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3