LocalTime.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. package models
  2. import (
  3. "strings"
  4. "time"
  5. )
  6. type LocalTime time.Time
  7. func init() {
  8. AddTableName("local_time")
  9. }
  10. const (
  11. timeFormat = "2006-01-02 15:04:05"
  12. zeroTime = "1970-01-01 00:00:00"
  13. )
  14. func NowLocal() LocalTime {
  15. return LocalTime(time.Now())
  16. }
  17. func (t *LocalTime) UnmarshalJSON(data []byte) error {
  18. if data[0] == '"' && data[len(data)-1] == '"' {
  19. data = data[1 : len(data)-1]
  20. }
  21. dataStr := strings.TrimSpace(string(data))
  22. if dataStr == "" {
  23. //now, err := time.ParseInLocation(timeFormat, string(data), time.Local)
  24. now, err := time.ParseInLocation(timeFormat, zeroTime, time.Local)
  25. *t = LocalTime(now)
  26. return err
  27. }
  28. var err error
  29. var now time.Time
  30. if strings.Index(dataStr, "T") > 0 {
  31. dataStr = strings.Replace(dataStr, "T", " ", 1)
  32. }
  33. if len(dataStr) > 19 {
  34. dataStr = dataStr[0:19]
  35. if dataStr == "1970-01-01 00:00:00" {
  36. dataStr = timeFormat
  37. }
  38. } else if len(dataStr) == 10 {
  39. dataStr += " 00:00:00"
  40. } else if len(dataStr) == 13 {
  41. dataStr += ":00:00"
  42. } else if len(dataStr) == 16 {
  43. dataStr += ":00"
  44. }
  45. now, err = time.ParseInLocation(timeFormat, dataStr, time.Local)
  46. *t = LocalTime(now)
  47. return err
  48. }
  49. func (t LocalTime) MarshalJSON() ([]byte, error) {
  50. b := make([]byte, 0, len(timeFormat)+2)
  51. b = append(b, '"')
  52. b = time.Time(t).AppendFormat(b, timeFormat)
  53. b = append(b, '"')
  54. return b, nil
  55. }
  56. func (t LocalTime) Value() time.Time {
  57. return time.Time(t)
  58. }
  59. func (t LocalTime) String() string {
  60. return t.Value().String()
  61. }
  62. // 数据库解析到对象时调用
  63. func (t *LocalTime) FromDB(data []byte) error {
  64. if data[0] == '"' && data[len(data)-1] == '"' {
  65. data = data[1 : len(data)-1]
  66. }
  67. dataStr := strings.TrimSpace(string(data))
  68. if dataStr == "" {
  69. now, err := time.ParseInLocation(timeFormat, zeroTime, time.Local)
  70. *t = LocalTime(now)
  71. return err
  72. }
  73. var err error
  74. var now time.Time
  75. if strings.Index(dataStr, "T") > 0 {
  76. dataStr = strings.Replace(dataStr, "T", " ", 1)
  77. }
  78. if len(dataStr) > 19 {
  79. dataStr = dataStr[0:19]
  80. if strings.Index(dataStr, "000") == 0 {
  81. // if dataStr == "0000-00-00 00:00:00" {
  82. dataStr = zeroTime
  83. }
  84. } else if len(dataStr) == 10 {
  85. dataStr += " 00:00:00"
  86. } else if len(dataStr) == 13 {
  87. dataStr += ":00:00"
  88. } else if len(dataStr) == 16 {
  89. dataStr += ":00"
  90. }
  91. now, err = time.ParseInLocation(timeFormat, dataStr, time.Local)
  92. *t = LocalTime(now)
  93. return err
  94. }
  95. // 对象解析到数据库时调用
  96. func (t LocalTime) ToDB() ([]byte, error) {
  97. dataStr := time.Time(t).Format(timeFormat)
  98. if strings.Index(dataStr, "000") == 0 {
  99. // if dataStr == "0000-00-00 00:00:00" {
  100. dataStr = zeroTime
  101. }
  102. b := make([]byte, 0, len(timeFormat)+2)
  103. b = append(b, []byte(dataStr)...)
  104. return b, nil
  105. }