Cron Expression Parser
Paste a cron expression like */15 9-17 * * 1-5 and see what it means in plain English, plus the next 5 times it will run.
Format: minute hour day-of-month month day-of-week
Enter a cron expression above to see its schedule, next run times, and a field-by-field breakdown.
Field-by-field breakdown
| Field | You entered | Meaning |
|---|
Common expressions — tap to try one
How to read a cron expression
A cron expression is five space-separated fields that tell a scheduler when to run a job: minute hour day-of-month month day-of-week. Each field narrows down the exact minutes a job is allowed to fire. This tool parses that syntax with a hand-written matcher (no external cron library), turns it into a plain-English sentence, lists the next 5 times it would actually run from right now, and breaks each of the 5 fields down individually so you can see exactly what you typed.
The five fields
| Field | Allowed values | Special syntax |
|---|---|---|
| Minute | 0–59 | *, lists, ranges, steps |
| Hour | 0–23 | *, lists, ranges, steps |
| Day of month | 1–31 | *, lists, ranges, steps |
| Month | 1–12 | *, JAN–DEC, lists, ranges, steps |
| Day of week | 0–6 (and 7) | *, SUN–SAT, lists, ranges, steps (0 and 7 both mean Sunday) |
Wildcards, steps, ranges, and lists
- Wildcard
*— every value is allowed for that field. - Step
*/5— every 5th value, starting from the field's minimum (0, 5, 10, 15... for minutes). - Range
9-17— every value from 9 through 17 inclusive. - Stepped range
9-17/2— every other value in that range: 9, 11, 13, 15, 17. - List
1,15,30— exactly those values, comma-separated, in any combination with the syntax above.
The day-of-month / day-of-week "OR" trap
This is the single most common cron surprise. When both the day-of-month and day-of-week fields are restricted (neither one is left as *), cron treats them as an OR condition, not AND. 0 0 1 * MON does not mean "the 1st, but only if it's a Monday" — it means "midnight on the 1st, OR midnight on any Monday," so it typically fires several times a month. To target only the 1st, leave day-of-week as *; to target only Mondays, leave day-of-month as *.
Common patterns
| Expression | Meaning |
|---|---|
*/5 * * * * | Every 5 minutes |
0 * * * * | Every hour, on the hour (@hourly) |
0 0 * * * | Every day at midnight (@daily) |
0 9 * * 1-5 | Every weekday at 09:00 |
0 0 * * 0 | Every Sunday at midnight (@weekly) |
0 0 1 * * | Midnight on the 1st of every month (@monthly) |
Worked examples
Example 1. 30 4 1,15 * * reads as "at 04:30, on days 1 and 15 of the month" — minute 30, hour 4, the 1st and 15th of every month, any day of the week. A billing job that needs to run twice a month, before business hours, is a typical use for this shape.
Example 2. */15 9-17 * * 1-5 reads as "every 15 minutes during hours 9 through 17, on Monday through Friday" — a health-check or sync job that only needs to run during business hours on weekdays, not around the clock.
Example 3. 0 0 29 2 * reads as "at 00:00, on day 29 of the month, in February" — a leap-day-only job. Because February 29th only exists on leap years, the next-run list will correctly skip straight to the next leap year instead of showing a run every year.
Timezones and privacy
The next-run times are calculated against your device's own local clock and timezone — the same clock your operating system already shows. A production crontab usually runs in the server's configured timezone (frequently UTC), which can differ from yours, so double-check the scheduler's timezone setting before treating the exact times shown here as final. Everything on this page — parsing, the description, and the next-run calculation — runs locally in your browser; your cron expression is never uploaded or sent to a server.
Sources & further reading
- RFC 3339 — date and time formats used when recording scheduled run times
- ISO 8601 — the international standard for representing dates, times and intervals
- NIST Time and Frequency Division — authoritative civil time, UTC and clock synchronisation
- MDN — JavaScript Date behaviour behind the local next-run calculation
Frequently asked questions
What do the 5 fields in a cron expression mean?
A standard cron expression has five space-separated fields, always in this order: minute (0-59), hour (0-23), day of the month (1-31), month (1-12 or JAN-DEC), and day of the week (0-6 or SUN-SAT, where both 0 and 7 mean Sunday). Each field can be a single value, a wildcard *, a comma-separated list like 1,15, a range like 9-17, or a step like */5. For example, 30 4 1,15 * * means "at 04:30, on the 1st and 15th of every month" — minute 30, hour 4, days 1 and 15, every month, any day of the week.
What's the difference between * and */5 in a cron expression?
A bare asterisk * means every value is allowed for that field — every minute, every hour, and so on. Adding a step with /N, as in */5, means every Nth value starting from the field's minimum, so */5 in the minute field matches 0, 5, 10, 15 ... 55, in other words every 5 minutes. A step can also follow a range, like 9-17/2, which matches every other hour from 9 through 17 (9, 11, 13, 15, 17).
How does cron handle day-of-month and day-of-week together, like 0 0 1 * MON?
This is a classic cron gotcha: when both the day-of-month and day-of-week fields are restricted (neither is *), most cron implementations — including this parser — treat them as OR, not AND. So 0 0 1 * MON runs at midnight on the 1st of the month OR on any Monday, whichever comes first, not only on a Monday that happens to land on the 1st. If you only want the 1st of the month, leave the day-of-week field as *; if you only want Mondays, leave the day-of-month field as *.
What timezone are the "next run times" calculated in?
The next run times are computed using your device's local date, time, and timezone, exactly like your computer's clock. A real crontab, however, runs in whatever timezone the server or scheduler is configured for (often UTC), which may not match your browser's timezone. If your server uses a different timezone, mentally shift the times shown here by the difference, or check the scheduler's own timezone setting before relying on the exact times.
Is my cron expression sent to a server?
No. Parsing, the plain-English description, and the next-run calculation all happen locally in your browser using plain JavaScript — nothing you type is uploaded, logged, or stored anywhere except your own browser's local storage, which just remembers your last expression for convenience. You can keep using this tool offline once the page has loaded, and no account or sign-up is required.