Cron Expression Parser
Paste a cron expression and get a plain-English explanation plus a preview of its next 5 run times.
Standard 5-field format: minute hour day-of-month month day-of-week.
The 5 fields
Minute, hour, day-of-month, month, day-of-week.
* means "every value." */5 means "every 5 units."
1-5 is a range. 1,3,5 is a list. Day-of-week runs
0 (Sunday) through 6 (Saturday).
A quick example
*/15 9-17 * * 1-5 means "every 15 minutes, between 9 AM and 5 PM,
Monday through Friday." Try the presets dropdown for more common schedules.
How it works
The parser splits your expression into its 5 fields and expands each one into an explicit
set of allowed values: */15 in the minute field becomes the set {0, 15, 30,
45}, 1-5 in day-of-week becomes {1, 2, 3, 4, 5}, and lists like
1,3,5 are unioned together. Every value is range-checked as it's expanded,
which is why a typo like 61 * * * * fails immediately with a message naming
the exact field and the range it expected, instead of silently producing a schedule that
never fires.
The "next 5 runs" list is computed by brute force, and that's a feature: starting from the
next whole minute, the code steps forward one minute at a time (up to a year, about
527,000 checks, which takes a few milliseconds) and tests each candidate minute against
the expanded sets. A useful side effect of simulating instead of calculating: expressions
that are syntactically valid but can never fire, like 0 0 30 2 * (February
30th), aren't an error, they just come back with "no matching run found in the next
year". If you see that message, your expression parses fine but describes a date that
doesn't exist or is more than a year away.
All date math uses the browser's Date object in your local time zone, and it
all runs in this page's JavaScript. Check DevTools' Network tab: no request is made when
you type an expression, so nothing about your infrastructure's schedules leaves your
machine.
Common questions
What cron format does this use?
The standard 5-field Unix cron format: minute (0-59), hour (0-23), day-of-month (1-31), month (1-12), and day-of-week (0-6, where 0 is Sunday). Some systems add a seconds field or use 7 for Sunday, this tool follows the common 5-field convention.
What happens if both day-of-month and day-of-week are set?
Standard cron semantics: if both fields are restricted (not *), the schedule matches when EITHER condition is true, not both. This trips a lot of people up, it's the same behavior as real crontab.
What time zone are the next-run times in?
Your browser's local time zone. If the job actually runs on a server in a different time zone, the real run times will differ.