Cron Expression Explainer

100% private — runs on your device, never uploaded. Works offline once loaded.

Type a cron expression (e.g. 0 9 * * 1-5) and see a plain-English explanation of when it runs. Everything is parsed locally in your browser.

The five fields, in the order cron actually reads them

A standard Unix cron expression packs a schedule into five space-separated fields, always in this order: minute (0–59), hour (0–23), day-of-month (1–31), month (1–12), day-of-week (0–6, where 0 is Sunday). So 0 9 * * 1-5 reads as "at minute 0 of hour 9, every day-of-month, every month, on days 1 through 5 (Monday–Friday)" — in plain English, 9:00 AM on weekdays. The syntax dates back to the original AT&T Unix cron daemon from the 1970s and has barely changed since, which is exactly why it's still confusing to read at a glance decades later.

Each field also supports a small set of operators: * means "every value," */5 means "every 5 units," 1-5 means a range, and 1,3,5 means a specific list — they can even be combined, like 0,30 9-17 * * * for every half hour during business hours.

The day-of-month / day-of-week trap

The single biggest source of cron confusion is that when both the day-of-month and day-of-week fields are restricted (i.e. neither is *), most cron implementations treat them as an OR, not an AND. So 0 0 15 * 1 doesn't mean "the 15th, if it's a Monday" — it fires on the 15th of every month AND on every Monday. This trips up even experienced engineers, and it's one of the specific things this explainer calls out when it appears in your expression.

Where cron expressions show up beyond crontab

You'll meet this exact syntax far beyond a Linux server's crontab file: Kubernetes CronJobs, GitHub Actions schedule triggers, AWS EventBridge rules (which actually use a 6-field variant with seconds and a mandatory day-of-week wildcard), Jenkins build triggers, and database backup schedulers all reuse the same or a closely related format. Getting a deploy pipeline's schedule wrong — say, running a nightly job at 0:00 UTC when the team actually meant 0:00 in their local timezone — is a common and quietly annoying bug to track down after the fact.

A timezone caveat worth remembering

Cron itself has no concept of timezone — it simply runs on whatever clock the host machine (or, for cloud schedulers, the platform) is set to, which is very often UTC. Before trusting a schedule that needs to line up with a specific local time (like "run at 6 AM Eastern"), check what timezone the executing system actually uses, since a schedule that looks correct in the expression can still fire at the wrong wall-clock time.

Frequently asked questions

Which cron format?

Standard 5-field Unix cron: minute hour day-of-month month day-of-week.

Is anything sent to a server?

No — parsing happens on your device.

What's the difference between 5-field and 6-field cron?

Standard Unix cron uses 5 fields (minute through day-of-week). Some schedulers, like Quartz (used by many Java frameworks) and AWS EventBridge, prepend a seconds field, making it 6 fields total — always check which flavor your target system expects.

What do shortcuts like @daily or @reboot mean?

These are non-standard convenience aliases some cron implementations support: @daily equals '0 0 * * *', @hourly equals '0 * * * *', and @reboot runs once at system startup rather than on a repeating schedule.

Why does my expression with both day-of-month and day-of-week seem to run too often?

When neither field is a wildcard, standard cron treats them as OR rather than AND, so the job fires when either condition is true — this is the single most common cron misunderstanding.

Does cron account for daylight saving time?

It depends on the implementation and the system's configured timezone — some cron daemons skip or double-run jobs scheduled during the DST transition hour, which is worth testing explicitly if your schedule falls near 1–3 AM.

Can I schedule something to run every 2nd Tuesday of the month?

Standard cron syntax alone can't express 'nth weekday of month' directly; you typically need a workaround field combination or application-level logic, since cron's day-of-week field only supports simple values, ranges, and lists.

Is my cron expression sent anywhere when I check it here?

No — the parsing and plain-English explanation are generated entirely by JavaScript running in your browser tab.

Advertisement