Every date in a recurrence, before it reaches your calendar
Expands a daily, weekly, monthly or yearly recurrence into actual dates, makes the missing-date rule explicit, and exports one standards-based all-day calendar event per occurrence.
The calendar
One standards-based all-day VEVENT per row, with exclusive next-day DTEND values and stable event identifiers.
Every date in the schedule
| 1 | 2026-08-01 | Saturday | 0 | Anchor date |
| 2 | 2026-08-15 | Saturday | 14 | Exact anchor day |
| 3 | 2026-08-29 | Saturday | 28 | Exact anchor day |
| 4 | 2026-09-12 | Saturday | 42 | Exact anchor day |
| 5 | 2026-09-26 | Saturday | 56 | Exact anchor day |
| 6 | 2026-10-10 | Saturday | 70 | Exact anchor day |
| 7 | 2026-10-24 | Saturday | 84 | Exact anchor day |
| 8 | 2026-11-07 | Saturday | 98 | Exact anchor day |
| 9 | 2026-11-21 | Saturday | 112 | Exact anchor day |
| 10 | 2026-12-05 | Saturday | 126 | Exact anchor day |
| 11 | 2026-12-19 | Saturday | 140 | Exact anchor day |
| 12 | 2027-01-02 | Saturday | 154 | Exact anchor day |
How it works
What this works out
“Every month” is incomplete whenever the first date is the 29th, 30th or 31st. February may not contain it; some other months do not contain the 31st; and a yearly February 29 exists only in leap years. A schedule needs to say whether a missing date moves or disappears.
This expands that decision before anything is imported. Every row is visible, downloadable as CSV, and also written to an iCalendar file as its own all-day event. There is no hidden recurrence rule for another application to interpret differently.
The method
Days and weeks are fixed calendar-day steps. Two weeks is fourteen days, so the weekday cannot change. The first date is already row one, which means twelve fortnightly dates have eleven gaps and span 154 days.
Months and years use an anchor instead. For row n, the destination month or year is found from the original date and the requested interval. The original day is then placed there if it exists. If it does not, month-end mode uses the last available day and skip mode moves on to the next candidate.
Before you read on
A monthly schedule starts on 31 January 2026 and uses month-end for missing dates. What is the March occurrence?
31 March. February's 28th is a local substitute for a missing 31st, not a new anchor. Deriving March directly from the original January 31 date prevents one short month from shifting every later occurrence.
A worked example
Start on Saturday 1 August 2026, repeat every two weeks, and ask for twelve dates:
| Occurrence | Date | Weekday | Days from start |
|---|---|---|---|
| 1 | 2026-08-01 | Saturday | 0 |
| 2 | 2026-08-15 | Saturday | 14 |
| 3 | 2026-08-29 | Saturday | 28 |
| 4 | 2026-09-12 | Saturday | 42 |
| 12 | 2027-01-02 | Saturday | 154 |
For a monthly schedule anchored on 31 January 2026, month-end mode begins 31 January, 28 February, 31 March and 30 April. Two of those first four dates are reported as moved to month end. Skip mode instead begins 31 January, 31 March, 31 May and 31 July, and the table says that each accepted row followed a skipped missing date. Both sequences and the fortnightly figures are asserted in the formula tests.
What the calendar file contains
Each row becomes an all-day VEVENT. Its DTSTART is the compact date and its
exclusive DTEND is the following day. The visitor’s title is escaped for
backslashes, commas, semicolons and line breaks; lines longer than 75 UTF-8
octets are folded with the required continuation space; and stable identifiers
mean importing a regenerated copy can be recognised as the same set of events.
The generation timestamp is the only current value in the file. It does not change the schedule and is not placed in the page URL or sent elsewhere.
How it is done
- Parse the first date as a Gregorian calendar anchor, then bound the interval and requested occurrence count before allocating the schedule.
- For days and weeks, add a fixed number of UTC calendar days. For months and years, derive every candidate from the original year, month and day rather than from the previous result.
- If a candidate month lacks the anchor day, either use its final day or omit that candidate, exactly as selected. Continue until the requested number of actual dates has been produced.
- Write the rows as separate RFC 5545 all-day VEVENT components. DTSTART is the date itself, DTEND is the following date because an all-day end is exclusive, and every content line is folded at 75 UTF-8 octets.
What it assumes
- The calendar is Gregorian and date-only. There is no time of day, time zone, daylight-saving transition or reminder to infer.
- The first date counts as occurrence one. Twelve dates therefore contain eleven intervals, not twelve.
- Month-end mode never changes the anchor. January 31 can become February 28 and then return to March 31 because each candidate is derived from the original day 31.
- Skip mode skips a missing candidate, not an interval. It continues through later candidate months or years until the requested number of real dates exists.
- Calendar years beyond 9999 cannot be represented by RFC 5545's four-digit DATE value and are not emitted.
Common questions
Does every month have a monthly recurrence date?
Only anchors from the first through the twenty-eighth exist in every month. The twenty-ninth, thirtieth and thirty-first require a rule for shorter months, which is why the tool asks instead of silently guessing.
Why is an all-day calendar event's end set to the next date?
RFC 5545 defines DTEND as a non-inclusive boundary. An event covering only 1 August therefore starts on 1 August and ends at the beginning of 2 August; using the same date for both would make a zero-length event.
Are weekly recurrences affected by daylight-saving time?
These are date-only rows, not instants. Adding seven calendar days keeps the weekday and does not contain a clock whose UTC offset could change.
Will importing the file create one repeating event or many events?
It creates one all-day VEVENT per visible row. That preserves the exact expanded schedule, including month-end adjustments and skipped dates, without relying on each calendar application's recurrence interpretation.