gorm时间格式化问题详解
说明
在做项目时发现gorm的时间格式是带有时区输入输出的,对平常使用的2020-01-03 12:22:33格式有一定的出入,不方便前端和后端的对接,所以自己整理一下处理这个问题方法,方便大家参考
代码如下
package models import ( "database/sql/driver" "errors" "fmt" "strings" "time" ) //BaseModel 基础结构体 信息信息 type BaseModel struct { CreateTime MyTime `gorm:"comment:'创建时间';type:timestamp;";json:"createTime"` UpdateTime MyTime `gorm:"comment:'修改时间';type:timestamp;";json:"updateTime"` Remark string `gorm:"comment:'备注'";json:"remark"` } //MyTime 自定义时间 type MyTime time.Time func (t *MyTime) UnmarshalJSON(data []byte) error { if string(data) == "null" { return nil } var err error //前端接收的时间字符串 str := string(data) //去除接收的str收尾多余的" timeStr := strings.Trim(str, "\"") t1, err := time.Parse("2006-01-02 15:04:05", timeStr) *t = MyTime(t1) return err } func (t MyTime) MarshalJSON() ([]byte, error) { formatted := fmt.Sprintf("\"%v\"", time.Time(t).Format("2006-01-02 15:04:05")) return []byte(formatted), nil } func (t MyTime) Value() (driver.Value, error) { // MyTime 转换成 time.Time 类型 tTime := time.Time(t) return tTime.Format("2006-01-02 15:04:05"), nil } func (t *MyTime) Scan(v interface{}) error { switch vt := v.(type) { case time.Time: // 字符串转成 time.Time 类型 *t = MyTime(vt) default: return errors.New("类型处理错误") } return nil } func (t *MyTime) String() string { return fmt.Sprintf("hhh:%s", time.Time(*t).String()) }
实现原理
其实现方式其实是通过在时间读取json时对解析格式进行重写,对转换成字符串时进行重写达到效果