Skip to main content

Cron Parser - parse and validate cron expressions online

At 04:30, every day.

Next runs · UTC

Run in CrontapCheatsheet

Calendar

September 2026 · UTC

0 runs

About this tool

Paste any cron expression and CronTool's parser tokenizes every field, validates the values against the accepted ranges, and emits a calendar of upcoming runs plus a plain-English description. The same parser @datasert/cronjs-parser backs production cron runtimes.
A cron parser does three things at once: lex the syntax, validate each field against its range, and project the schedule onto real timestamps. Skip any of those and you ship a cron that parses fine but never fires.

What the cron parser does

  1. Tokenize - split the string into fields by whitespace, detect 5/6/7-field shapes, and split each field into atoms (literals, ranges, lists, steps, modifiers).
  2. Validate - check each atom against the field range (minute 0-59, hour 0-23, etc.). Surface the offending field if anything is off.
  3. Compute next matches - given a start time (now, by default), compute the next N timestamps the expression fires. This is the bit a parser alone can't do - you need the matcher too.

Cron parser libraries by language

Parser edge cases to watch

  • 5 vs 6 vs 7 fields - different parsers count differently. Standard cron is 5; AWS is 6; Quartz is 6 or 7. The same string parses to different schedules under different dialects.
  • Day-of-week 0 vs 7 - both are Sunday in Unix cron, but Quartz uses 1-7 (1=Sunday). Always verify against the calendar.
  • February 31 - most parsers accept it as syntactically valid but it never fires. The matcher silently returns no matches.
  • Daylight saving - runs in the skipped hour are skipped; runs in the repeated hour fire twice. Most parsers don't flag this.

Examples

  • 0 18 * * *
    Every day at 18:00
  • 0 */5 * * *
    Every 5 hours
  • 0 18 * * 1-5
    Weekdays at 18:00
  • 0 0 1 * *
    Once a month, on the 1st at midnight

Cheatsheet

Full cheatsheet
FieldReq.RangeWildcards
minuteyes0-59, - * /
houryes0-23, - * /
day of monthyes1-31, - * /
monthyes1-12 or JAN-DEC, - * /
day of weekyes0-6 or names; some dialects use 0-7 or 1-7 — see Dialects, - * /

Frequently asked questions

Syntax

How do I parse a cron expression?

Paste it into CronTool. @datasert/cronjs-parser validates the fields, cronstrue creates the English sentence, and the matcher computes five next runs plus the visible month's calendar.

Why is my cron failing to parse?

Typical causes are missing fields, out-of-range values, descending ranges, invalid steps, or misplaced special characters. CronTool converts parser errors into messages such as Hour must be 0-23; Standard mode separately rejects ?, but L does not inherently require Extended mode.

Cron field ranges
Is there an online cron parser I can use?

Yes, this page parses cron in the browser. Production analytics may record valid, copied, or shared cron strings, so do not treat it as a no-transmission surface; use your runtime's parser for sensitive programmatic validation.

What does the cron parser output?

CronTool displays editable fields with help, a humanized validation result, an English sentence, five next runs in the selected timezone, and a month calendar. It does not expose an AST or simultaneous local-and-UTC lists.

How many fields should the cron parser expect?

Standard cron has five fields. Quartz has six with required seconds and an optional seventh year; AWS EventBridge has six minute-first fields including year.

Field counts by dialect
Which parser errors identify a field range?

It rejects values outside their field, such as minute 60, hour 24, day-of-month 32, or month 13. The field highlight identifies where parsing stopped.

Accepted field ranges
How does CronTool parse compound field tokens?

It accepts literals, comma lists, inclusive ranges, steps, names, and supported special forms through Datasert's grammar. Acceptance is not proof that another scheduler supports the same token.

Cron operators

Timing

How does the parser expand a step token?

*/15 in the minute field expands within 0-59 to 0, 15, 30, and 45. Steps reset at field boundaries rather than measuring elapsed time. Expression: */15 * * * *

Open in editor
Nth-minute syntax guide

Days and months

Can the parser read an nth-weekday token?

Yes, in a supporting Extended dialect. 0 0 9 ? * MON#2 parses MON#2 as the second Monday and ? as an unspecified day-of-month. Expression: 0 0 9 ? * MON#2

Open in editor
Nth weekday rule
Does parsing both day fields mean they are ANDed?

No. Parsing proves the tokens are valid; Vixie runtime semantics OR two restricted day fields. 0 9 1 * 1 therefore runs on Mondays and month-day 1. Expression: 0 9 1 * 1

Open in editor
Day-field semantics
Why is a successful parse not proof of a future run?

Fields can be individually valid while their calendar combination is impossible. CronTool statically catches fixed cases such as 0 0 30 2 *, but an empty capped matcher result alone is not proof of never firing. Expression: 0 0 30 2 *

Open in editor

Platforms

What library should I use to parse cron in code?

Choose the library used by your runtime: CronTool uses @datasert/cronjs-parser plus @datasert/cronjs-matcher; common alternatives include dragonmantank for PHP, robfig for Go, Quartz or Spring for Java, and NCrontab for .NET. CronTool does not emulate their differing semantics.

Dialect matrix
Why does ? produce a parser error in Standard mode?

? is not a Standard Vixie operator. Switch to Extended mode for a dialect that uses it to leave one day field unspecified.

Question-mark operator

Debugging

What is needed to reproduce a parser result?

Share cron=<expression> and add mode=extended when needed. Add tz=<IANA zone> when reproducing next-run timestamps; Copy link does not include timezone.

Where does CronTool's parser boundary end?

The boundary ends at schedule fields and derived previews. CronTool never executes commands and cannot inspect PATH, environment variables, permissions, or scheduler logs.

Runtime debugging checklist

Write the cron here. Run it on Crontap.

Point Crontap at any URL. Pick any cron. Done.

WordPress, Shopify, Railway, Cloud Run, Vercel, HubSpot, Ghost, your own box. If it answers HTTP, Crontap can drive it on a clock you can read, in the timezone that actually matters, and page you when something breaks.

1.9k+ teams · Free forever tier · No credit card