1 回答
TA贡献1942条经验 获得超3个赞
错误已经说明出了什么问题:
将时间“2019-01-01 00:00:00”解析为“2006-01-02T15:04:05Z07:00”:无法将“00:00:00”解析为“T”
您正在传递"2019-01-01 00:00:00"
,而它需要不同的时间格式,即RFC3339(UnmarshalJSON 的默认格式)。
要解决这个问题,您要么想要以预期的格式传递时间"2019-01-01T00:00:00Z00:00"
,要么像这样定义您自己的类型CustomTime
:
const timeFormat = "2006-01-02 15:04:05"
type CustomTime time.Time
func (ct *CustomTime) UnmarshalJSON(data []byte) error {
newTime, err := time.Parse(timeFormat, strings.Trim(string(data), "\""))
if err != nil {
return err
}
*ct = CustomTime(newTime)
return nil
}
func (ct *CustomTime) MarshalJSON() ([]byte, error) {
return []byte(fmt.Sprintf("%q", time.Time(*ct).Format(timeFormat))), nil
}
小心,您可能还需要为要在数据库内外解析的时间实现Valuer和Scanner接口,如下所示:
func (ct CustomTime) Value() (driver.Value, error) {
return time.Time(ct), nil
}
func (ct *CustomTime) Scan(src interface{}) error {
if val, ok := src.(time.Time); ok {
*ct = CustomTime(val)
} else {
return errors.New("time Scanner passed a non-time object")
}
return nil
}
去游乐场的例子。
- 1 回答
- 0 关注
- 106 浏览
添加回答
举报