jkbrzt / rrule

JavaScript library for working with recurrence rules for calendar dates as defined in the iCalendar RFC and more.

Home Page:https://jkbrzt.github.io/rrule

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Combining MINUTELY with BYHOUR and BYDAY misses out days when used with just one BYHOUR value

mfosker opened this issue · comments

I may have misunderstood how to use this library, but am seeing fewer dates returned than I would expect for rRules such as :
FREQ=MINUTELY;INTERVAL=60;BYDAY=MO;BYHOUR=9

Originally I was setting up a schedule for an event that runs every 90 minutes between 09:00 to 17:00 using a rule like:
FREQ=MINUTELY;INTERVAL=90;BYDAY=MO,TU,WE,TH,FR;BYHOUR=9,10,11,12,13,14,15,16

Which seemed to work fine.
When I reduce the hours down to just '9' i.e at 9a.m I noticed that the number of results dropped massively, missing out entire weeks.

I've narrowed it down to a simple reproducible pair:
DTSTART:20230901T090000\nRRULE:FREQ=MINUTELY;INTERVAL=60;BYDAY=MO;BYHOUR=0,9;UNTIL=20231231T235900

Creates events at 00:00 and 09:00 every Monday from 1st Sept until the end of the year:

      2023-09-04T00:00:00.000Z, 2023-09-04T09:00:00.000Z,
      2023-09-11T00:00:00.000Z, 2023-09-11T09:00:00.000Z,
      2023-09-18T00:00:00.000Z, 2023-09-18T09:00:00.000Z,
      2023-09-25T00:00:00.000Z, 2023-09-25T09:00:00.000Z,
      2023-10-02T00:00:00.000Z, 2023-10-02T09:00:00.000Z,
      2023-10-09T00:00:00.000Z, 2023-10-09T09:00:00.000Z,
      2023-10-16T00:00:00.000Z, 2023-10-16T09:00:00.000Z,
      2023-10-23T00:00:00.000Z, 2023-10-23T09:00:00.000Z,
      2023-10-30T00:00:00.000Z, 2023-10-30T09:00:00.000Z,
      2023-11-06T00:00:00.000Z, 2023-11-06T09:00:00.000Z,
      2023-11-13T00:00:00.000Z, 2023-11-13T09:00:00.000Z,
      2023-11-20T00:00:00.000Z, 2023-11-20T09:00:00.000Z,
      2023-11-27T00:00:00.000Z, 2023-11-27T09:00:00.000Z,
      2023-12-04T00:00:00.000Z, 2023-12-04T09:00:00.000Z,
      2023-12-11T00:00:00.000Z, 2023-12-11T09:00:00.000Z,
      2023-12-18T00:00:00.000Z, 2023-12-18T09:00:00.000Z,
      2023-12-25T00:00:00.000Z, 2023-12-25T09:00:00.000Z
    ]

Removing just the 0, i.e having the event at just 09:00 :
DTSTART:20230901T090000\nRRULE:FREQ=MINUTELY;INTERVAL=60;BYDAY=MO;BYHOUR=9;UNTIL=20231231T235900

results in a far smaller list of events:

      2023-09-11T09:00:00.000Z,
      2023-10-02T09:00:00.000Z,
      2023-10-23T09:00:00.000Z,
      2023-11-13T09:00:00.000Z,
      2023-12-04T09:00:00.000Z,
      2023-12-25T09:00:00.000Z
    ]

This issue occurs whether I use the iCal style as shown above or if I construct the rRule using Javascript.

  freq: RRule.MINUTELY,
  dtstart: new Date(Date.UTC(2023, 8, 1, 9, 0, 0)),
  tzid: Europe/London,
  until: new Date(Date.UTC(2023, 11, 31, 21, 35, 0)),
  interval: 90,
  byweekday: RRule.MO,
  byhour: [0, 9]
})

works fine, but:

  freq: RRule.MINUTELY,
  dtstart: new Date(Date.UTC(2023, 8, 1, 9, 0, 0)),
  tzid: Europe/London,
  until: new Date(Date.UTC(2023, 11, 31, 21, 35, 0)),
  interval: 90,
  byweekday: RRule.MO,
  byhour: [9]
})

returns only 6 results.

I'm using rRule 2.2.9 and these results were observed in Jest tests on MacOS
Node v18.16.0

Currently it is BST where I am

Thanks for all your work on rRule