Recurring Date Generator
Recurrence rules are easy to state and easy to get wrong. "The 31st of every month" has no answer in February; "the fifth Tuesday" does not exist in most months; "every 29 February" happens three years in four not at all. Every calendar application resolves these silently and they do not all resolve them the same way. This expands the rule into real dates and tells you, occurrence by occurrence, where it had to do something you might not have expected.
What this generator does
Turns a rule into a list of dates you can check. Calendar apps do this too, but they do it invisibly and inconsistently — some clamp the 31st to the 30th, some skip the month entirely, and none of them tell you which. This does the same expansion and annotates every occurrence where the rule could not be honoured exactly, so the awkward months are visible before they are somebody's problem.
How to use this tool
- Enter the first date as YYYY-MM-DD.
- Choose how it repeats, and set the details for that kind.
- Set how many occurrences you want.
- Read the list — anything that had to move is flagged.
Understanding the controls
- First date
- The starting point, and for some rules the source of the defaults. Try 2026-01-31 to see the interesting behaviour immediately.
- Repeats
- Six kinds: every N days, every N weeks, a day of the month, the nth weekday, the last weekday, and yearly. The monthly kinds are the ones with edge cases.
- Day of the month
- 29, 30 and 31 are the interesting values. Where a month is shorter, the occurrence is clamped to the last day of that month and the clamping is stated on that row.
- Which weekday, and which one
- 'The third Tuesday' is unambiguous; 'the fifth Tuesday' exists in only about four months a year, and where it does not the occurrence falls back to the last one and says so.
- How many occurrences
- Up to 120, which is ten years of a monthly rule.
Worked examples
- 31st of every month from January 2024
- 31 Jan, 29 Feb (clamped, and flagged), 31 Mar, 30 Apr (clamped).
- Third Tuesday, 2024
- 16 Jan, 20 Feb, 19 Mar — all Tuesdays, all third in their month.
- Last Friday, 2024
- 26 Jan, 23 Feb, 29 Mar.
- Every 29 February
- 2024 then 2025-02-28, flagged as moved because 2025 has no 29 February.
Common use cases
- Working out the actual dates of a monthly meeting on the last Friday
- Checking what a billing rule set to the 31st does in February
- Producing a year of dates for a rota, a newsletter or a standing order
- Testing recurrence handling in something you are building
- Filling in a calendar for a committee that meets on the second Tuesday
How this generator works
Day and week rules are simple addition. Monthly rules walk month by month and resolve within each one: a day-of-month rule clamps to the length of that month, an nth-weekday rule counts weekdays from the first of the month, and a last-weekday rule counts back from the last. Every resolution that changed the requested date carries a note explaining what it did — silently emitting 1 March for 'the 31st of February' is how a billing bug starts, so it does not.
Randomness and fairness
Nothing here is random. The same rule and start date always produce the same list, which is what makes it usable for checking a system's behaviour against.
For how randomness is produced across the whole site, see how Generate Random works.
Assumptions this tool makes
- A month that cannot honour the rule exactly should produce the nearest date rather than no date at all.
Limitations and good to know
- It expands one rule at a time. Real calendars combine rules and exceptions, and this does not model exclusions or one-off moves.
- Clamping is one defensible choice among several. Some systems skip the month instead; where that matters, the flagged rows tell you exactly where the two would differ.
- There is no timezone or time-of-day handling — these are dates.
- The expanded dates exist only on this page — copy them into the calendar or system that will actually use them.
Common mistakes
- Setting a monthly rule to the 31st and assuming it means 'the last day'
- They are different rules and they differ in eleven months of the year. Use the last-weekday or day-of-month rule deliberately.
- Relying on the fifth weekday of a month
- Most months do not have one. The tool falls back to the last and flags it, but a rota built on it will be irregular.
Practical tips
- Generate a full year before committing a recurrence to a calendar everybody else relies on.
- Look for the flagged rows first — those are the months somebody will query.
Privacy and your data
The dates and rule settings stay in your browser. Nothing is uploaded, nothing persists between visits, and nothing is written into the page address. Analytics records only that the tool was used.
Frequently asked questions
- What happens to the 31st in February?
- It is clamped to the last day of February — 28 or 29 — and the row says that it moved and why. Clamping and skipping are both defensible, and the flag is there so you can tell which behaviour you are getting.
- Why does my fifth Tuesday keep moving?
- Because most months do not have five Tuesdays. Where there is no fifth, the occurrence falls back to the last one and is flagged.
- Can it handle 'the last working day of the month'?
- Not directly — that combines a recurrence with a holiday calendar. Generate the last-weekday dates here, then check them against the business day calculator.
Related generators
- Business Day CalculatorWorking days between two dates, and the date a number of working days away — with both ends counted and holidays excluded.
- Date Edge Case GeneratorThe dates that break software — leap days, month ends, clock changes, ISO week boundaries — as real test data.
- Event Countdown PlannerWorks backwards from the date to tell you when each job has to start, and says plainly when the plan does not fit.