主要是重写 time.Time 的 MarshalJSON 和 UnmarshalJSON 方法
示例如下
package entity
import (
"database/sql/driver"
"fmt"
"time"
)
// time format template(UnmarshalJSON and MarshalJSON)
const (
YYYYMMDD = "2006-01-02"
DefaultTimeFormat = "2006-01-02 15:04:05"
)
type LocalTime time.Time
// 日期序列化
func (t *LocalTime) MarshalJSON() ([]byte, error) {
tTime := time.Time(*t)
return []byte(fmt.Sprintf("\"%v\"", tTime.Format("2006-01-02 15:04:05"))), nil
}
// 日期反序列化
func (t *LocalTime) UnmarshalJSON(data []byte) (err error) {
now, err := time.ParseInLocation(`"`+DefaultTimeFormat+`"`, string(data), time.Local)
*t = LocalTime(now)
return
}
// 日期的String 方法
func (t LocalTime) String() string {
return time.Time(t).Format(DefaultTimeFormat)
}
func (t LocalTime) Value() (driver.Value, error) {
var zeroTime time.Time
tlt := time.Time(t)
//判断给定时间是否和默认零时间的时间戳相同
if tlt.UnixNano() == zeroTime.UnixNano() {
return nil, nil
}
return tlt, nil
}
func (t *LocalTime) Scan(v interface{}) error {
if value, ok := v.(time.Time); ok {
*t = LocalTime(value)
return nil
}
return fmt.Errorf("can not convert %v to timestamp", v)
}
type User struct {
Id uint64 `json:"id" gorm:"primaryKey" query:"id" vd:"$!='Hertz'" comment:"主键" `
Name string `json:"name" gorm:"column:name" query:"name" vd:"$!='Hertz'" `
Age int `json:"age" gorm:"column:age" query:"age" vd:"$>0" msg:"年龄必须大于0" `
Birthday *LocalTime `json:"birthday" gorm:"column:birthday" query:"birthday" `
}
// TableName 会将 User 的表名重写为 `profiles`
func (User) TableName() string {
return "user"
}
最后修改于 2022-12-29 11:37:29
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付

