主要是重写 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
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付
上一篇