time.go 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. package models
  2. import (
  3. "strings"
  4. "time"
  5. )
  6. type Time time.Time
  7. const (
  8. timeFormat = "2006-01-02 15:04:05"
  9. )
  10. func NowLocal() Time {
  11. return Time(time.Now())
  12. }
  13. func (t *Time) UnmarshalJSON(data []byte) error {
  14. if data[0] == '"' && data[len(data)-1] == '"' {
  15. data = data[1 : len(data)-1]
  16. }
  17. dataStr := strings.TrimSpace(string(data))
  18. if dataStr == "" {
  19. now, err := time.ParseInLocation(timeFormat, string(data), time.Local)
  20. *t = Time(now)
  21. return err
  22. }
  23. var err error
  24. var now time.Time
  25. if strings.Index(dataStr, "T") > 0 {
  26. dataStr = strings.Replace(dataStr, "T", " ", 1)
  27. }
  28. if len(dataStr) > 19 {
  29. dataStr = dataStr[0:19]
  30. if dataStr == "0001-01-01 00:00:00" {
  31. dataStr = timeFormat
  32. }
  33. } else if len(dataStr) == 10 {
  34. dataStr += " 00:00:00"
  35. } else if len(dataStr) == 13 {
  36. dataStr += ":00:00"
  37. } else if len(dataStr) == 16 {
  38. dataStr += ":00"
  39. }
  40. now, err = time.ParseInLocation(timeFormat, dataStr, time.Local)
  41. *t = Time(now)
  42. return err
  43. }
  44. func (t Time) MarshalJSON() ([]byte, error) {
  45. b := make([]byte, 0, len(timeFormat)+2)
  46. b = append(b, '"')
  47. b = time.Time(t).AppendFormat(b, timeFormat)
  48. b = append(b, '"')
  49. return b, nil
  50. }