package core import ( "database/sql/driver" "encoding/json" "fmt" "time" "gorm.io/gorm" "gorm.io/gorm/schema" ) const DateFormat = "2006-01-02" const TimeFormat = "2006-01-02 15:04:05" // NullTime 自定义时间格式 type NullTime struct { Time *time.Time Valid bool // Format string } // func (t *NullTime) IsZero() bool { // return t.Valid // } func (t *NullTime) UnmarshalJSON(bs []byte) error { var date string err := json.Unmarshal(bs, &date) if err != nil { return err } if date == "" { *t = NullTime{ Time: nil, Valid: false, } return nil } tt, _ := time.ParseInLocation(TimeFormat, date, time.Local) *t = NullTime{ Time: &tt, Valid: true, } return nil } // MarshalJSON 将NullTime类型的时间转化为JSON字符串格式 // 返回转化后的JSON字符串和错误信息 func (t NullTime) MarshalJSON() ([]byte, error) { if t.Valid { if t.Time == nil { return json.Marshal(nil) } tt := *t.Time tStr := tt.Format(TimeFormat) return json.Marshal(tStr) } else { return json.Marshal(nil) } } // 写入数据库gorm调用 func (t NullTime) Value() (driver.Value, error) { timeStr := t.String() if timeStr == "" { return nil, nil } return timeStr, nil } // 读取数据gorm调用 func (t *NullTime) Scan(v any) error { switch val := v.(type) { case time.Time: tt := val.Format(TimeFormat) if tt == "0001-01-01 00:00:00" { *t = NullTime{ Time: nil, Valid: false, } } else { *t = NullTime{ Time: &val, Valid: true, } } return nil } return fmt.Errorf("NullTime cant convert %s", v) } func (t NullTime) String() string { if !t.Valid { return "" } if t.Time == nil { return "" } tt := *t.Time return tt.Format(TimeFormat) } func (NullTime) GormDBDataType(db *gorm.DB, field *schema.Field) string { // 使用 field.Tag、field.TagSettings 获取字段的 tag // 查看 https://github.com/go-gorm/gorm/blob/master/schema/field.go 获取全部的选项 // 根据不同的数据库驱动返回不同的数据类型 // switch db.Dialector.Name() { // case "mysql", "sqlite": // return "JSON" // case "postgres": // return "JSONB" // } // return "" return "DATETIME" }