go從gorm讀取數據庫時間字段問題,莫名加了時區和T,要重寫time的方法才能轉化過來
package utils import ( "database/sql/driver" "errors" "fmt" "strings" "time" ) type FormatTime time.Time const timeLayout = "2006-01-02" func (t *FormatTime) UnmarshalJSON(data []byte) (err error) { str := string(data) if str == "" { return nil } trim := strings.Trim(str, "\"") parse, err := time.Parse(timeLayout, trim) *t = FormatTime(parse) return err } func (t FormatTime) MarshalJSON() ([]byte, error) { if time.Time(t).IsZero() { return []byte(`""`), nil } formatTime := fmt.Sprintf("\"%v\"", time.Time(t).Format(timeLayout)) return []byte(formatTime), nil } func (t FormatTime) Value() (driver.Value, error) { fTime := time.Time(t) return fTime.Format(timeLayout), nil } func (t *FormatTime) Scan(v interface{}) error { switch vt := v.(type) { case time.Time: *t = FormatTime(vt) default: return errors.New("傳入類型錯誤") } return nil } func (t *FormatTime) String() string { return fmt.Sprintf("hhh:%s", time.Time(*t).String()) }
使用方法
FromDate utils.FormatTime `gorm:"column:from_date" db:"from_date" json:"from_date" form:"from_date"`
結構體裏面用utils.FormatTime轉化就可以了。