LocalTime.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  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. )
  13. func NowLocal() LocalTime {
  14. return LocalTime(time.Now())
  15. }
  16. func (t *LocalTime) UnmarshalJSON(data []byte) error {
  17. if data[0] == '"' && data[len(data)-1] == '"' {
  18. data = data[1 : len(data)-1]
  19. }
  20. dataStr := strings.TrimSpace(string(data))
  21. if dataStr == "" {
  22. now, err := time.ParseInLocation(timeFormat, string(data), time.Local)
  23. *t = LocalTime(now)
  24. return err
  25. }
  26. var err error
  27. var now time.Time
  28. if strings.Index(dataStr, "T") > 0 {
  29. dataStr = strings.Replace(dataStr, "T", " ", 1)
  30. }
  31. if len(dataStr) > 19 {
  32. dataStr = dataStr[0:19]
  33. if dataStr == "0001-01-01 00:00:00" {
  34. dataStr = timeFormat
  35. }
  36. } else if len(dataStr) == 10 {
  37. dataStr += " 00:00:00"
  38. } else if len(dataStr) == 13 {
  39. dataStr += ":00:00"
  40. } else if len(dataStr) == 16 {
  41. dataStr += ":00"
  42. }
  43. now, err = time.ParseInLocation(timeFormat, dataStr, time.Local)
  44. *t = LocalTime(now)
  45. return err
  46. }
  47. func (t LocalTime) MarshalJSON() ([]byte, error) {
  48. b := make([]byte, 0, len(timeFormat)+2)
  49. b = append(b, '"')
  50. b = time.Time(t).AppendFormat(b, timeFormat)
  51. b = append(b, '"')
  52. return b, nil
  53. }
  54. func (t LocalTime) Value() time.Time {
  55. return time.Time(t)
  56. }
  57. func (t LocalTime) String() string {
  58. return t.Value().String()
  59. }
  60. // 数据库解析到对象时调用
  61. func (t *LocalTime) FromDB(data []byte) error {
  62. return t.UnmarshalJSON(data)
  63. }
  64. // 对象解析到数据库时调用
  65. func (t LocalTime) ToDB() ([]byte, error) {
  66. b := make([]byte, 0, len(timeFormat)+2)
  67. b = append(b, []byte(time.Time(t).Format(timeFormat))...)
  68. return b, nil
  69. }