Skip to main content

Cron expression parser

Parse and visualize any cron expression with a human-readable explanation and upcoming run times.

Free & unlimited
Cron expression
*/5
Minute
*
Hour
*
Day of month
*
Month
*
Day of week
Quick presets
Every 5 minutes
Field breakdown
Minute
*/5
0, 5, 10, 15, 20, 25… (12 values)
Hour
*
every value (0–23)
Day of month
*
every value (1–31)
Month
*
JanFebMarAprMayJunJulAugSepOctNovDec
Day of week
*
SunMonTueWedThuFriSat
Upcoming runs
Show
#WhenRelative
19/16/2026, 4:20:00 PMin 3 min
29/16/2026, 4:25:00 PMin 8 min
39/16/2026, 4:30:00 PMin 13 min
49/16/2026, 4:35:00 PMin 18 min
59/16/2026, 4:40:00 PMin 23 min
69/16/2026, 4:45:00 PMin 28 min
79/16/2026, 4:50:00 PMin 33 min
89/16/2026, 4:55:00 PMin 38 min
99/16/2026, 5:00:00 PMin 43 min
109/16/2026, 5:05:00 PMin 48 min
All processing happens in your browser. No data is sent to any server.

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

Key facts about Cron expression parser
Fields expectedExactly 5, whitespace separated: minute, hour, day-of-month, month, day-of-week
Field ranges0-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 valuesjan-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 limitThe 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 length5, 10, 25 or 50 upcoming runs, switchable without retyping the expression
Day-of-month and day-of-weekMatched 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 usedYour computer's local time, taken from the browser — not the timezone of the machine that will run the job
Presets8 ready expressions, from every-minute to yearly on 1 January
Validation behaviourAnything 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 gridMonth 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. 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. 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. 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. 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. 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. 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.

Specs & compatibility
DialectPOSIX / Vixie crontab, 5 fields
Seconds fieldNot supported — Quartz and Spring six-field expressions are rejected
Macro shorthandNot supported — expand @daily to 0 0 * * * first
Maximum look-ahead1 year of minutes
OutputsEnglish summary, per-field value map, run table with absolute and relative time
Date formattingBrowser toLocaleString, so the run table follows your OS date and time format
CopyClipboard API — a browser permission prompt may appear the first time
NetworkNone after page load; works offline
BrowsersAny 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.
No. The parser accepts only the five numeric fields, so shorthand macros are rejected with the Expected 5 fields message. Expand them first: @yearly is 0 0 1 1 *, @monthly is 0 0 1 * *, @weekly is 0 0 * * 0, @daily and @midnight are 0 0 * * *, and @hourly is 0 * * * *. There is no fixed expression for @reboot because it depends on machine start, not on a clock, so nothing here can preview it.
Not directly. Quartz, Spring and several Java schedulers put a seconds field in front, and some add a year field at the end. Those are six or seven fields and this parser refuses them rather than guessing which field is which. Drop the leading seconds field and any trailing year field, paste the remaining five, and read the result as minute-level accuracy. Anything sub-minute, and the L, W, # and ? operators those dialects add, is outside what this page can evaluate.
Your own. The run list is built from the browser clock, so it shows when the job would fire if it ran on the machine you are sitting at. A server on UTC, a CI runner in another region, or a container with TZ unset will fire the same expression at a different local hour. When the difference matters, work out the schedule in the server timezone first and treat the list here as a pattern check rather than a promise about wall-clock time.
Three causes cover almost all of it. First, an out-of-range value: weekday 7, month 0 or day-of-month 32 parse cleanly but can never match. Second, an impossible date combination such as 0 0 30 2 *, which asks for 30 February. Third, a day-of-month and day-of-week pair that this page requires to agree; the search runs a year forward and gives up if nothing matches in that window.
At 09:00, every day of every month, but only on Monday through Friday. Read the fields left to right: minute 0, hour 9, any day of the month, any month, weekdays 1 to 5. The grid on the page shows the same thing visually: one highlighted minute, one highlighted hour, all 31 days, all 12 months and five of the seven weekday chips. The run table then confirms it by skipping Saturday and Sunday.
No. The parser and the run-time search are ordinary JavaScript functions inside the page bundle, running in your tab. No request goes out while you type, no analytics event carries the expression, and nothing is written to local storage — a refresh resets the field to the default. You can verify it by opening the network panel in developer tools and watching it stay silent while you edit, or by loading the page and then going offline.
View all

Updated

We use anonymous analytics to improve ToolChamp. No personal data is stored or sold. Privacy Policy