问题说明
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"`
}