package models import ( "strings" "time" ) type LocalTime time.Time func init() { AddTableName("local_time") } const ( timeFormat = "2006-01-02 15:04:05" zeroTime = "0001-01-01 00:00:00" ) func NowLocal() LocalTime { return LocalTime(time.Now()) } func (t *LocalTime) UnmarshalJSON(data []byte) error { if data[0] == '"' && data[len(data)-1] == '"' { data = data[1: len(data)-1] } dataStr := strings.TrimSpace(string(data)) if dataStr == "" { //now, err := time.ParseInLocation(timeFormat, string(data), time.Local) now, err := time.ParseInLocation(timeFormat, zeroTime, time.Local) *t = LocalTime(now) return err } var err error var now time.Time if strings.Index(dataStr, "T") > 0 { dataStr = strings.Replace(dataStr, "T", " ", 1) } if len(dataStr) > 19 { dataStr = dataStr[0:19] if dataStr == "0001-01-01 00:00:00" { dataStr = timeFormat } } else if len(dataStr) == 10 { dataStr += " 00:00:00" } else if len(dataStr) == 13 { dataStr += ":00:00" } else if len(dataStr) == 16 { dataStr += ":00" } now, err = time.ParseInLocation(timeFormat, dataStr, time.Local) *t = LocalTime(now) return err } func (t LocalTime) MarshalJSON() ([]byte, error) { b := make([]byte, 0, len(timeFormat)+2) b = append(b, '"') b = time.Time(t).AppendFormat(b, timeFormat) b = append(b, '"') return b, nil } func (t LocalTime) Value() time.Time { return time.Time(t) } func (t LocalTime) String() string { return t.Value().String() } // 数据库解析到对象时调用 func (t *LocalTime) FromDB(data []byte) error { if data[0] == '"' && data[len(data)-1] == '"' { data = data[1: len(data)-1] } dataStr := strings.TrimSpace(string(data)) if dataStr == "" { now, err := time.ParseInLocation(timeFormat, zeroTime, time.Local) *t = LocalTime(now) return err } var err error var now time.Time if strings.Index(dataStr, "T") > 0 { dataStr = strings.Replace(dataStr, "T", " ", 1) } if len(dataStr) > 19 { dataStr = dataStr[0:19] if dataStr == "0000-00-00 00:00:00" { dataStr = zeroTime } } else if len(dataStr) == 10 { dataStr += " 00:00:00" } else if len(dataStr) == 13 { dataStr += ":00:00" } else if len(dataStr) == 16 { dataStr += ":00" } now, err = time.ParseInLocation(timeFormat, dataStr, time.Local) *t = LocalTime(now) return err } // 对象解析到数据库时调用 func (t LocalTime) ToDB() ([]byte, error) { b := make([]byte, 0, len(timeFormat)+2) b = append(b, []byte(time.Time(t).Format(timeFormat))...) return b, nil }