Go的json格式化时,time.Time字段默认的格式是类似这样的:2022-08-10T15:31:42+08:00,这个不太友好,实际上这个格式是可以自定义的。网上搜到几种方法:
- 定义一个新的类型替换time.Time,实现json需要的方法,包括MarshalJSON,如果需要插入数据库,还需要根据具体的数据库要求实现相应的方法,例如Value和Scan
- 不替换time.Time,而是重载整个struct的MarshalJSON方法
第二种方法灵活度更好,影响也更小一些,不会涉及到数据库类型的问题,而且还可以同时处理多个字段的自定义。我们来看一下代码:
type Book struct {
Id int64 `db:"id" json:"id"`
Uid int64 `db:"uid" json:"uid"`
Title string `db:"title" json:"title"`
Cover string `db:"cover" json:"cover"`
CreateTime time.Time `db:"create_time" json:"created_time"`
}
func (b Book) MarshalJSON() ([]byte, error) {
type Alias Book
return json.Marshal(&struct {
Alias
CreateTime string `json:"created_time"`
}{
Alias: Alias(b),
CreateTime: i.CreateTime.Format("2006-01-02 15:04:05"),
})
}