# Recurring Date Schedule Maker

> 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.

Use it: https://tessalor.com/en/time/recurring-date-schedule

This tool runs entirely in the browser. Nothing entered into it is uploaded.

## How it is done

1. Parse the first date as a Gregorian calendar anchor, then bound the interval and requested occurrence count before allocating the schedule.
2. 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.
3. 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.
4. 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.

## Assumptions

- 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.

## Inputs

| Name | Label | Type | Default | Range |
| --- | --- | --- | --- | --- |
| `startDate` | First date | date | 2026-08-01 |  |
| `interval` | Repeat every | integer | 2 | 1 to 365 |
| `unit` | Interval unit | select | weeks |  |
| `occurrences` | Dates to make | integer | 12 | 2 to 500 |
| `missingDateRule` | When a month lacks the anchor day | select | lastDay |  |
| `eventTitle` | Calendar event name | text | Scheduled date |  |

## Outputs

- `lastDate` — Last date (text), primary
- `datesGenerated` — Dates generated (integer)
- `calendarSpanDays` — First to last (days) (integer)
- `lastWeekday` — Last date falls on (text)
- `adjustedDates` — Dates moved to month-end (integer)

## 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.

## Sources

- [Internet Calendaring and Scheduling Core Object Specification (iCalendar)](https://www.rfc-editor.org/rfc/rfc5545.html) — RFC Editor, applies to Gregorian DATE values, VEVENT, exclusive DTEND, text escaping and content-line folding. Retrieved 2026-08-01.

## Variants

- [What are the dates every two weeks from 1 August 2026?](https://tessalor.com/en/time/recurring-date-schedule/dates-every-two-weeks)
- [What does a monthly schedule from January 31 do in February?](https://tessalor.com/en/time/recurring-date-schedule/monthly-dates-from-january-31)

---

Estimate, not advice. See https://tessalor.com/en/disclaimer.
Machine-readable catalogue: https://tessalor.com/api/tools.json
