LocalTime.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  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. 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 == "0001-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 dataStr == "0000-00-00 00:00:00" {
  81. dataStr = zeroTime
  82. }
  83. } else if len(dataStr) == 10 {
  84. dataStr += " 00:00:00"
  85. } else if len(dataStr) == 13 {
  86. dataStr += ":00:00"
  87. } else if len(dataStr) == 16 {
  88. dataStr += ":00"
  89. }
  90. now, err = time.ParseInLocation(timeFormat, dataStr, time.Local)
  91. *t = LocalTime(now)
  92. return err
  93. }
  94. // 对象解析到数据库时调用
  95. func (t LocalTime) ToDB() ([]byte, error) {
  96. b := make([]byte, 0, len(timeFormat)+2)
  97. b = append(b, []byte(time.Time(t).Format(timeFormat))...)
  98. return b, nil
  99. }