Start a project

Tool 162 of 194 · Time

iCalendar RRULE Expander

Paste an RRULE and see exactly when each occurrence falls, in local time and UTC, including the ones daylight saving moves.

iCalendar RRULE Expander

Recurrence

Occurrences

#Local timeUTCNote

A local time that doesn't exist because the clocks go forward is moved forward by the gap, and one that happens twice uses the first, as RFC 5545 says. COUNT includes instances that EXDATE then removes.

Occurrences as CSV

01

What it does

Expands RFC 5545 recurrence rules into every occurrence in local time and UTC, applying EXDATE and RDATE and handling daylight saving gaps.

  • FREQ from MINUTELY to YEARLY with INTERVAL, COUNT and UNTIL
  • BYDAY with ordinals (2TU, -1FR), BYMONTHDAY, BYMONTH, BYYEARDAY, BYWEEKNO, BYHOUR, BYMINUTE, BYSETPOS and WKST
  • DTSTART with TZID, EXDATE and RDATE
  • Times in a DST gap moved forward, repeated times use the first, as RFC 5545 says

02

Private by design

Everything happens in your browser. Nothing you type, paste or upload is sent anywhere, and it keeps working offline once the page has loaded.

03

What you get

Every occurrence, a plain-English summary and a CSV, with a Copy and a Download button on every result.

  • iCalendar
  • RRULE
  • RFC 5545
  • Time zones

Why it matters

Recurrence rules look simple until they meet real calendars: the last Friday of each month, the 31st in months that have only 30 days, every other week with the week starting on Sunday, or a meeting at 1:30am on the day the clocks change. Calendar apps disagree about edge cases, and most online expanders ignore time zones.

This expander implements RFC 5545's rules, including ordinal weekdays, BYSETPOS and week numbers, and its results match python-dateutil, the reference most server code uses, on the test rules. Occurrences are built in the event's own time zone, then converted to UTC using your browser's time zone data, so you can see the ones that land in a daylight saving gap or overlap.

How to use it

  1. Paste DTSTART and RRULE lines from an .ics file, or just an RRULE.
  2. Choose the time zone if there's no TZID.
  3. Read the occurrences and any DST notes.
  4. Copy the CSV if you need the dates elsewhere.

FAQ

What does BYSETPOS do?

It picks positions from the set of matches in each period. FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-1 is the last weekday of each month.

Does COUNT include dates removed by EXDATE?

Yes. COUNT limits the instances the rule generates; EXDATE then removes some of them.

What happens to an event at 1:30am when the clocks go forward?

RFC 5545 says to use the offset from before the gap, so it moves to 2:30am. If the clocks go back, the first 1:30am is used.

What if the 31st doesn't exist in a month?

That month is skipped. RFC 5545 ignores invalid dates rather than moving them.

Work with me

Want a site that gets these right?

I build fast, accessible websites and web apps that pass these checks from day one. Tell me about your project and I'll reply personally with honest next steps.

All developer tools · Back to leej.uk