ICS RRULE Occurrence Expander

List every occurrence of a recurring-event RRULE up to a given date

Ad placeholder (leaderboard)

This tool expands an iCalendar RRULE — the recurrence rule that powers repeating events in .ics calendar files — into the actual list of dates it produces. Paste a rule and a start date, choose how far ahead to look, and see every occurrence, which is invaluable when debugging a calendar feed or confirming exactly when a “second Tuesday of the month” meeting falls.

How it works

An RRULE is a set of KEY=VALUE pairs separated by semicolons, governed by RFC 5545. Expansion works period by period:

  1. FREQ sets the base cadence — daily, weekly, monthly or yearly — and INTERVAL skips periods (e.g. INTERVAL=2 with FREQ=WEEKLY is every other week).
  2. Within each period, the BY parts select candidate dates. BYDAY chooses weekdays, optionally with an ordinal: 2MO is the second Monday, -1FR is the last Friday. BYMONTHDAY selects days of the month (negative counts from the end), and BYMONTH restricts yearly rules to specific months.
  3. BYSETPOS then picks particular positions out of that candidate set — BYSETPOS=-1 keeps only the last matching day in the period, which is how “last working day of the month” rules are written.
  4. The walk stops when it reaches COUNT occurrences, passes the UNTIL date, or hits your expansion cutoff, whichever comes first.

WKST defines which weekday a week starts on, which affects how weekly intervals are aligned.

Example

The rule FREQ=MONTHLY;BYDAY=2TU with a DTSTART in January produces the second Tuesday of every month. Change it to FREQ=WEEKLY;BYDAY=MO,WE,FR;INTERVAL=1 and you get every Monday, Wednesday and Friday. Add ;COUNT=10 and only the first ten of those occurrences are returned.

Tips

  • Always provide a realistic cutoff date. Open-ended rules (no COUNT or UNTIL) are infinite, so the cutoff and the max-results cap are what keep the expansion finite.
  • Date formats accepted are the iCalendar YYYYMMDD and YYYYMMDDTHHMMSSZ forms as well as plain ISO dates like 2026-12-31.
  • If you expect occurrences but see none, check that your DTSTART weekday is consistent with BYDAY — a weekly rule only emits the weekdays you list, and a DTSTART that does not match any of them simply produces nothing until the next listed day.
Ad placeholder (rectangle)