Cron expression parser
Parse and visualize any cron expression with a human-readable explanation and upcoming run times.
| # | When | Relative |
|---|---|---|
| 1 | 9/16/2026, 4:20:00 PM | in 3 min |
| 2 | 9/16/2026, 4:25:00 PM | in 8 min |
| 3 | 9/16/2026, 4:30:00 PM | in 13 min |
| 4 | 9/16/2026, 4:35:00 PM | in 18 min |
| 5 | 9/16/2026, 4:40:00 PM | in 23 min |
| 6 | 9/16/2026, 4:45:00 PM | in 28 min |
| 7 | 9/16/2026, 4:50:00 PM | in 33 min |
| 8 | 9/16/2026, 4:55:00 PM | in 38 min |
| 9 | 9/16/2026, 5:00:00 PM | in 43 min |
| 10 | 9/16/2026, 5:05:00 PM | in 48 min |
Type or paste a five-field crontab line and this page reads it back three ways at once: a plain-English sentence, a field-by-field grid that lights up every value the expression actually matches, and a table of the next 5 to 50 times it will fire with a relative countdown next to each. The parser is written directly into the page — it expands each field into a set of integers, then walks forward minute by minute looking for the first match, so what you see is a real schedule enumeration rather than a canned description. It accepts the classic Vixie style: asterisks, lists, ranges, step values and three-letter month and weekday names. It deliberately does not guess at what it cannot parse; a malformed field is rejected rather than silently ignored.
Key facts about Cron expression parser
| Fields expected | Exactly 5, whitespace separated: minute, hour, day-of-month, month, day-of-week |
|---|---|
| Field ranges | 0-59, 0-23, 1-31, 1-12, 0-6 — Sunday is 0 |
| Operators parsed | * (all), , (list), - (range), / (step), and a step applied to a single starting value such as 5/10 |
| Named values | jan-dec and sun-sat, case-insensitive, usable on both sides of a range |
| Not parsed | @reboot, @daily and the other shorthand macros; a seconds field; the Quartz extensions L, W, # and ?; the value 7 for Sunday |
| Look-ahead limit | The search walks at most 525,960 minutes — one year — before it gives up, so a schedule that fires less than once a year returns a short list |
| Run list length | 5, 10, 25 or 50 upcoming runs, switchable without retyping the expression |
| Day-of-month and day-of-week | Matched together: both fields must agree. Vixie cron treats them as an OR when both are restricted, so an expression that constrains both will list fewer runs here than it will actually fire on a server |
| Clock used | Your computer's local time, taken from the browser — not the timezone of the machine that will run the job |
| Presets | 8 ready expressions, from every-minute to yearly on 1 January |
| Validation behaviour | Anything other than 5 fields is refused with the message Expected 5 fields; an unreadable field stops the whole parse instead of degrading to a guess |
| Field grid | Month and weekday are drawn as 12 and 7 labelled chips; minute and hour are drawn as a dot map so a */7 pattern is visible at a glance |
What happens to your file
The expression never leaves the tab. Parsing is plain JavaScript already loaded with the page: each field is split on commas, expanded into a Set of integers, and then a Date cursor is advanced one minute at a time to collect the matching timestamps. There is no request to any server, no cron-parsing API and no library fetched at runtime, so once the page has loaded you can disconnect from the network and it keeps working. Nothing is saved to local storage either — reload the page and it starts again on the default */5 * * * *. The only data that ever leaves the page is the expression you deliberately put on the clipboard with the copy button.
About this tool
- 1
Paste the crontab line
Drop in the five fields exactly as they appear in your crontab, CI schedule or Kubernetes CronJob spec. Leave out the command — only the schedule belongs in the box.
- 2
Read the English summary
The line under the input turns the expression into a sentence, for example every 5 minutes, or At 09:00 on Mon, Tue, Wed, Thu, Fri. If the summary does not say what you meant, the expression is wrong, not the summary.
- 3
Check the field grid
Each of the five fields is drawn out with its matched values highlighted. This is where an off-by-one shows up: a range that starts at 1 when you meant 0, or a month list that quietly dropped a value.
- 4
Scan the next run times
Switch the run count to 25 or 50 when you need to see a pattern rather than the next fire. The relative column tells you how far apart the runs really are.
- 5
Fix and re-read
Edit the expression in place — the summary, the grid and the table all recompute on every keystroke, so you can nudge a step value and watch the run spacing change.
- 6
Copy it back
Use the copy button to put the validated expression on the clipboard and paste it into your crontab or pipeline YAML.
| Dialect | POSIX / Vixie crontab, 5 fields |
|---|---|
| Seconds field | Not supported — Quartz and Spring six-field expressions are rejected |
| Macro shorthand | Not supported — expand @daily to 0 0 * * * first |
| Maximum look-ahead | 1 year of minutes |
| Outputs | English summary, per-field value map, run table with absolute and relative time |
| Date formatting | Browser toLocaleString, so the run table follows your OS date and time format |
| Copy | Clipboard API — a browser permission prompt may appear the first time |
| Network | None after page load; works offline |
| Browsers | Any current Chrome, Edge, Firefox or Safari; no WebAssembly and no worker needed |
- A step can start anywhere, not just at zero: 5/15 in the minute field means minutes 5, 20, 35 and 50, which spreads load away from the top of the hour where every other job runs.
- If both the day-of-month and the day-of-week field are restricted, check the result against your real cron implementation. This page requires both to match; classic Unix cron fires when either matches, which is one of the oldest traps in crontab.
- Sunday is 0 here. Writing 7 produces a valid-looking expression with no upcoming runs, which is the fastest way to spot that the value is out of range.
- Use the run table as a sanity check on frequency: if you expected a nightly job and the relative column reads in 5 min, your hour field is still an asterisk.
- Month and weekday names are accepted in ranges too, so 0 8 * * mon-fri is equivalent to 0 8 * * 1-5 and is considerably easier to review in a pull request.
- The run times are in your local timezone. A server running UTC will fire the same expression at a different wall-clock hour, and daylight saving shifts that gap twice a year.
- If a preset almost matches what you need, load it and edit one field — it is faster than writing five fields from memory.
- Plain-English reading of the expression
- Per-field value map
- Next 5 to 50 run times
- Relative countdown per run
- Named month and weekday support
- 8 common presets
- Copy to clipboard
- Confirm that a schedule in a Kubernetes CronJob or GitHub Actions workflow fires when the ticket says it should.
- Debug a job that never runs by checking whether the expression matches any minute at all in the next year.
- Review a crontab you inherited and translate each line into something a colleague can read.
- Work out the real interval of a step expression such as */7, where the gap across an hour boundary is not what people expect.
- Spread a fleet of jobs off the top of the hour by trying different step offsets and watching the run table.
- Teach the five-field layout by changing one field at a time and watching the grid light up.
Related tools
View allWorks well with this5
More in Data & Dev12
Updated