time.go 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. package model
  2. import (
  3. "database/sql/driver"
  4. "fmt"
  5. "time"
  6. )
  7. const timeFormat = "2006-01-02 15:04:05"
  8. const timezone = "Asia/Shanghai"
  9. type Time time.Time
  10. func (t Time) MarshalJSON() ([]byte, error) {
  11. b := make([]byte, 0, len(timeFormat)+2)
  12. b = append(b, '"')
  13. b = time.Time(t).AppendFormat(b, timeFormat)
  14. b = append(b, '"')
  15. return b, nil
  16. }
  17. func (t *Time) UnmarshalJSON(data []byte) (err error) {
  18. now, err := time.ParseInLocation(`"`+timeFormat+`"`, string(data), time.Local)
  19. *t = Time(now)
  20. return
  21. }
  22. func (t Time) String() string {
  23. return time.Time(t).Format(timeFormat)
  24. }
  25. func (t Time) local() time.Time {
  26. loc, _ := time.LoadLocation(timezone)
  27. return time.Time(t).In(loc)
  28. }
  29. func (t Time) Value() (driver.Value, error) {
  30. var zeroTime time.Time
  31. var ti = time.Time(t)
  32. if ti.UnixNano() == zeroTime.UnixNano() {
  33. return nil, nil
  34. }
  35. return ti, nil
  36. }
  37. func (t *Time) Scan(v interface{}) error {
  38. value, ok := v.(time.Time)
  39. if ok {
  40. *t = Time(value)
  41. return nil
  42. }
  43. return fmt.Errorf("can not convert %v to timestamp", v)
  44. }