1 喜欢

Gorm自定义时间格式化

admin
admin
2021-04-27 11:09:41 阅读 3581

问题说明

go使用gorm做数据库映射时,数据库里存储时间为UTC时间,格式为2019-08-09T11:35:52+08:00这样的,如果希望得到2019-08-09 11:35:52这种输出怎么办呢?

参考代码

package model import ( "database/sql/driver" "fmt" "time" ) type XTime struct { time.Time } // 2. 为 Xtime 重写 MarshaJSON 和 UnmarshalJSON 方法,在此方法中实现自定义格式的转换; func (t *XTime) 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 = XTime{t1} return err } func (t XTime) MarshalJSON() ([]byte, error) { output := fmt.Sprintf("\"%s\"", t.Format("2006-01-02 15:04:05")) return []byte(output), nil } // 3. 为 Xtime 实现 Value 方法,写入数据库时会调用该方法将自定义时间类型转换并写入数据库; func (t XTime) Value() (driver.Value, error) { var zeroTime time.Time if t.Time.UnixNano() == zeroTime.UnixNano() { return nil, nil } return t.Time, nil } // 4. 为 Xtime 实现 Scan 方法,读取数据库时会调用该方法将时间数据转换成自定义时间类型; func (t *XTime) Scan(v interface{}) error { value, ok := v.(time.Time) if ok { *t = XTime{Time: value} return nil } return fmt.Errorf("can not convert %v to timestamp", v) } // 5. 自定义 BaseModel,结构和 gorm.Model 一致,将 time.Time 替换为 Xtime; type BaseModel struct { ID uint `gorm:"primaryKey" json:"id" form:"id"` CreateTime XTime `gorm:"comment:'创建时间'" json:"createdTime"` UpdateTime XTime `gorm:"comment:'更新时间'" json:"updateTime"` DeleteTime *XTime `gorm:"index;comment:'删除时间'" json:"deleteTime"` }

关于作者
admin
admin
admin@ifront.net
 获得点赞 173
 文章阅读量 240311