time_struct.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. package common
  2. import (
  3. "errors"
  4. "time"
  5. )
  6. var (
  7. _zero = time.Time{}
  8. yearError = errors.New("年份不能为负数")
  9. monthError = errors.New("月份不能大于12或小于1")
  10. dayError = errors.New("日期不能大于31或小于1")
  11. outOfBindTimeError = errors.New("查询时间大于当前系统时间")
  12. )
  13. type TimeDay struct {
  14. Year int `json:"year"` // 年
  15. Month uint8 `json:"month"` // 月份
  16. Day int `json:"day"` // 日期
  17. }
  18. // 根据日期获取每月的开始和结束时间
  19. /**
  20. 规则:1、月份大于当前时间抛出异常
  21. 2、当前时间属于当前月份,最后时间返回当前时间的次日0点
  22. 3、查询月份小于当前月,则返回正常区间
  23. 4、格式不符合抛出异常,比如年份=0或者<0,月份是0或负数或者大于12
  24. */
  25. func (day TimeDay) GetMonthWithError() (start time.Time, end time.Time, err error) {
  26. if day.Year <= 0 {
  27. return _zero, _zero, yearError
  28. }
  29. if day.Month < 1 || day.Month > 12 {
  30. return _zero, _zero, monthError
  31. }
  32. now := time.Now()
  33. // 月份开始时间,大于当前时间,直接异常
  34. dateStart := time.Date(day.Year, time.Month(day.Month), 1, 0, 0, 0, 0, time.Local)
  35. if dateStart.After(now) {
  36. return _zero, _zero, outOfBindTimeError
  37. }
  38. // 月份结束时间,如果大于当前时间,取当前时间的 day+1
  39. dateEnd := time.Date(day.Year, time.Month(day.Month+1), 1, 0, 0, 0, 0, time.Local)
  40. if dateEnd.After(now) {
  41. year, month, day := now.Date()
  42. return dateStart, time.Date(year, month, day+1, 0, 0, 0, 0, time.Local), nil
  43. }
  44. // 正常结束
  45. return dateStart, dateEnd, nil
  46. }
  47. func (day TimeDay) GetMonthSecWithError() (start int64, end int64, err error) {
  48. s, e, err := day.GetMonthWithError()
  49. if err != nil {
  50. return 0, 0, err
  51. }
  52. return Time2Second(s), Time2Second(e), nil
  53. }
  54. // 根据日期获取 每日的开始和结束时间
  55. /**
  56. 规则:1、规则不符合抛出异常
  57. 2、Mysql的Between属于左闭右闭,所以保证准确性应该是 2020-09-03 00:00:00 和 2020-09-03 23:59:59
  58. 这里推荐使用Between函数,因为between函数最终解析成了 2020-09-03 00:00:00 <= x <= 2020-09-03 23:59:59
  59. 2020-09-03 返回 2020-09-03 00:00:00 和 2020-09-03 23:59:59
  60. */
  61. func (day TimeDay) GetDayWithError() (start time.Time, end time.Time, err error) {
  62. if day.Year <= 0 {
  63. return _zero, _zero, yearError
  64. }
  65. if day.Month < 1 || day.Month > 12 {
  66. return _zero, _zero, monthError
  67. }
  68. if day.Day < 1 || day.Day > 31 {
  69. return _zero, _zero, dayError
  70. }
  71. s := time.Date(day.Year, time.Month(day.Month), day.Day, 0, 0, 0, 0, time.Local)
  72. e := GetTomorrow(s).Add(-time.Second)
  73. return s, e, nil
  74. }
  75. func (day TimeDay) GetDaySecWithError() (start int64, end int64, err error) {
  76. s, e, err := day.GetDayWithError()
  77. if err != nil {
  78. return 0, 0, err
  79. }
  80. return Time2Second(s), Time2Second(e), nil
  81. }