daily.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package openTime
  2. import (
  3. "fmt"
  4. "sort"
  5. "strings"
  6. "time"
  7. ctime "github.com/cherry-game/cherry/extend/time"
  8. )
  9. type (
  10. dailyParser struct{}
  11. daily struct {
  12. times []*durationRange
  13. }
  14. )
  15. func (p *dailyParser) Parse(params string) (OpenTime, error) {
  16. times := []*durationRange{}
  17. for _, v := range strings.Split(params, ";") {
  18. s := strings.Split(string(v), "-")
  19. if len(s) < 2 {
  20. return nil, fmt.Errorf("nonsupport params: %s", params)
  21. }
  22. startTime, err := parseDuration(s[0])
  23. if err != nil {
  24. return nil, err
  25. }
  26. endTime, err := parseDuration(s[1])
  27. if err != nil {
  28. return nil, err
  29. }
  30. if startTime > endTime {
  31. startTime, endTime = endTime, startTime
  32. }
  33. times = append(times, &durationRange{
  34. startTime: startTime,
  35. endTime: endTime,
  36. })
  37. }
  38. sort.Slice(times, func(i, j int) bool { return times[i].startTime < times[j].startTime })
  39. return &daily{times: times}, nil
  40. }
  41. func (p *daily) Between(t *ctime.CherryTime) bool {
  42. duration := t.Sub(t.StartOfDay().Time).Seconds()
  43. for _, v := range p.times {
  44. if v.startTime.Seconds() <= duration && duration <= v.endTime.Seconds() {
  45. return true
  46. }
  47. }
  48. return false
  49. }
  50. func (p *daily) TimeRange(t *ctime.CherryTime) (ctime.CherryTime, ctime.CherryTime) {
  51. startOfDay := t.StartOfDay()
  52. duration := t.Sub(startOfDay.Time).Seconds()
  53. for _, v := range p.times {
  54. if duration <= v.startTime.Seconds() || duration <= v.endTime.Seconds() {
  55. startTime := ctime.NewTime(startOfDay.Add(v.startTime), true)
  56. endTime := ctime.NewTime(startOfDay.Add(v.endTime), true)
  57. return startTime, endTime
  58. }
  59. }
  60. // 下一天
  61. nextTime := ctime.NewTime(startOfDay.Add(24*time.Hour), true)
  62. return p.TimeRange(&nextTime)
  63. }