LocalTime.go 2.4 KB

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