time.go 1.2 KB

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