99tools

RRULE Builder & Explainer

runs in your browser

Build an iCalendar RRULE from controls, or paste one and read it in plain English — with the next twenty dates it actually produces.

Repeats
On
Ends

The rule

paste one here, or build it above

Every week.

The dates it actually gives

next 20 from 2026-01-01
  1. 12026-01-01Thu
  2. 22026-01-08Thu
  3. 32026-01-15Thu
  4. 42026-01-22Thu
  5. 52026-01-29Thu
  6. 62026-02-05Thu
  7. 72026-02-12Thu
  8. 82026-02-19Thu
  9. 92026-02-26Thu
  10. 102026-03-05Thu
  11. 112026-03-12Thu
  12. 122026-03-19Thu
  13. 132026-03-26Thu
  14. 142026-04-02Thu
  15. 152026-04-09Thu
  16. 162026-04-16Thu
  17. 172026-04-23Thu
  18. 182026-04-30Thu
  19. 192026-05-07Thu
  20. 202026-05-14Thu

about this tool

One line of RFC 5545 that says "the last Friday of every month". Calendar apps write them, schedulers borrowed the format, and almost nobody can read one at a glance.

Build one with the controls, or paste one and read it back.

The dates are the point

A sentence can be wrong in a way that reads perfectly well. "Every month on the last Friday" sounds right whether or not the rule underneath it actually says that.

A list of the next twenty dates cannot be wrong in that way. If those dates are the ones you expected, the rule is right — and that check takes a second where re-reading the syntax takes a minute and still leaves you unsure.

The parts that catch people

BYDAY=-1FR is the last Friday. The number is an ordinal within the period, and a negative one counts back from the end. 1FR is the first, 2TU the second Tuesday.

BYMONTHDAY=31 is skipped, not moved. It fires in January, March and May and simply does not occur in the months that are shorter. Most people expect it to fall back to the 30th or the 28th. It does not, and the date list makes that obvious immediately.

A fifth weekday does not exist every month. BYDAY=5FR fires only in the months that have five Fridays, which is fewer than half of them.

M in FREQ=MONTHLY and the M in BYDAY are unrelated. So are the two meanings of an interval: INTERVAL counts periods from the start date, not occurrences, so FREQ=WEEKLY;INTERVAL=2 is every second week whether or not anything fell in the week between.

WKST decides which day starts a week, which changes which dates count as the same week. It only matters when the interval is above 1, and this page raises it only then.

How the dates are worked out

By walking day by day from the start and testing each one against the rule, rather than by computing each occurrence directly.

The direct version is faster and is where all the corner cases live — the 31st of a short month, the fifth Friday, the 29th of February. Walking and testing gets all three right without a special case for any of them, and forty years of days is nothing for a browser.

Everything is calculated in UTC. A recurrence rule describes a pattern of wall-clock times, and mixing a local timezone into the arithmetic makes an occurrence vanish or double around a daylight-saving change.

No library

rrule on npm is the usual choice and is around 60 KB for the part used here. The walk is a few dozen lines, every rule it supports is one it has been tested against, and the page loads faster for it.

It reads FREQ, INTERVAL, BYDAY, BYMONTHDAY, BYMONTH, COUNT, UNTIL and WKST. Anything else in the line is ignored rather than refused, since a rule this cannot fully describe still has dates worth showing.

Nothing is sent

It runs in your browser.

For the other repeating-schedule syntax, the cron expression parser does the same job for cron lines. To see a rule in the file it came from, or to put one into an event you are sending, the calendar (.ics) viewer & builder opens and writes those.

questions

What is an RRULE?
One line of RFC 5545 that describes a repeating event — FREQ=MONTHLY;BYDAY=-1FR is the last Friday of every month. Calendar files use them, and so do schedulers that borrowed the format.
What does BYDAY=-1FR mean?
The last Friday. The number before the day is an ordinal within the period: 1FR is the first Friday, 2TU the second Tuesday, and a negative counts back from the end.
What happens to the 31st in a month that has thirty days?
It is skipped, not moved. BYMONTHDAY=31 fires in January, March, May and so on, and simply does not occur in the shorter months. That surprises people, so the page says it and the date list shows it.
Why does the tool show dates as well as a sentence?
Because a sentence can be wrong in a way that reads perfectly well, and a list of the next twenty dates cannot. If the dates are what you expected, the rule is right.
What is WKST for?
It sets which day a week starts on, which changes which days fall in the same week — so it only affects a weekly rule with an interval above 1. The page mentions it only where it can change the answer.