LocalTime.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  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 strings.Index(dataStr, "000") == 0 {
  36. dataStr = zeroTime
  37. }
  38. // if dataStr == "1970-01-01 00:00:00" {
  39. // dataStr = timeFormat
  40. // }
  41. } else if len(dataStr) == 10 {
  42. dataStr += " 00:00:00"
  43. } else if len(dataStr) == 13 {
  44. dataStr += ":00:00"
  45. } else if len(dataStr) == 16 {
  46. dataStr += ":00"
  47. }
  48. now, err = time.ParseInLocation(timeFormat, dataStr, time.Local)
  49. *t = LocalTime(now)
  50. return err
  51. }
  52. func (t LocalTime) MarshalJSON() ([]byte, error) {
  53. b := make([]byte, 0, len(timeFormat)+2)
  54. b = append(b, '"')
  55. b = time.Time(t).AppendFormat(b, timeFormat)
  56. b = append(b, '"')
  57. return b, nil
  58. }
  59. func (t LocalTime) Value() time.Time {
  60. return time.Time(t)
  61. }
  62. func (t LocalTime) String() string {
  63. return t.Value().String()
  64. }
  65. // 数据库解析到对象时调用
  66. func (t *LocalTime) FromDB(data []byte) error {
  67. if data[0] == '"' && data[len(data)-1] == '"' {
  68. data = data[1 : len(data)-1]
  69. }
  70. dataStr := strings.TrimSpace(string(data))
  71. if dataStr == "" {
  72. now, err := time.ParseInLocation(timeFormat, zeroTime, time.Local)
  73. *t = LocalTime(now)
  74. return err
  75. }
  76. var err error
  77. var now time.Time
  78. if strings.Index(dataStr, "T") > 0 {
  79. dataStr = strings.Replace(dataStr, "T", " ", 1)
  80. }
  81. if len(dataStr) > 19 {
  82. dataStr = dataStr[0:19]
  83. if strings.Index(dataStr, "000") == 0 {
  84. // if dataStr == "0000-00-00 00:00:00" {
  85. dataStr = zeroTime
  86. }
  87. } else if len(dataStr) == 10 {
  88. dataStr += " 00:00:00"
  89. } else if len(dataStr) == 13 {
  90. dataStr += ":00:00"
  91. } else if len(dataStr) == 16 {
  92. dataStr += ":00"
  93. }
  94. now, err = time.ParseInLocation(timeFormat, dataStr, time.Local)
  95. *t = LocalTime(now)
  96. return err
  97. }
  98. // 对象解析到数据库时调用
  99. func (t LocalTime) ToDB() ([]byte, error) {
  100. dataStr := time.Time(t).Format(timeFormat)
  101. if strings.Index(dataStr, "000") == 0 {
  102. // if dataStr == "0000-00-00 00:00:00" {
  103. dataStr = zeroTime
  104. }
  105. b := make([]byte, 0, len(timeFormat)+2)
  106. b = append(b, []byte(dataStr)...)
  107. return b, nil
  108. }