Cron Expression Explainer
Paste a cron expression, get a plain-English explanation plus the next 5 run times. Handles macros (@daily, @hourly), ranges, and steps. Free, in-browser.
What this does
Takes a cron expression — the 5-field schedule strings used by Unix cron, anacron, Kubernetes CronJob, GitHub Actions, AWS EventBridge, and most other schedulers — and tells you in plain English what it means, plus the next 5 times it would actually fire (in your local time zone).
The 5 fields, in order
* * * * *
| | | | |
| | | | └── day of week (0–6, where 0 = Sunday; some systems also accept 7 = Sunday)
| | | └──── month (1–12)
| | └────── day of month (1–31)
| └──────── hour (0–23)
└────────── minute (0–59)
Each field accepts:
- A specific number (
5= the 5th) - A range (
1-5= Mon–Fri in the day-of-week field) - A list (
1,15= the 1st and 15th of the month) - An interval (
*/15= every 15 units) - A wildcard (
*= every value)
Day-of-week names (MON, TUE, WED, …) and month names (JAN, FEB, …) work too.
Macros
Many cron implementations accept these shortcuts:
| Macro | Equivalent | Meaning |
|---|---|---|
@yearly / @annually | 0 0 1 1 * | Once a year, midnight Jan 1 |
@monthly | 0 0 1 * * | First of every month, midnight |
@weekly | 0 0 * * 0 | Sunday midnight |
@daily / @midnight | 0 0 * * * | Every day at midnight |
@hourly | 0 * * * * | Top of every hour |
These are NOT supported by every cron implementation. POSIX cron and BusyBox don’t accept them. GNU cron (Debian/Ubuntu/Fedora) does. AWS EventBridge does not — use cron(0 0 * * ? *) instead.
The day-of-month vs day-of-week gotcha
This trips up almost everyone. When BOTH day-of-month and day-of-week are restricted, cron treats them as OR, not AND.
0 0 1 * 1 # Runs at midnight on the 1st OR every Monday
Most users assume that means “the 1st if it’s a Monday.” It doesn’t — that schedule fires on every 1st AND every Monday. To get “1st only if Monday”, you need a wrapper script that checks the date.
This tool’s “next runs” calculation handles the OR semantics correctly. If you see runs you didn’t expect, that’s why.
Common scheduling mistakes
- Setting
*/7for “every 7 minutes.” Actually fires at minutes 0, 7, 14, 21, 28, 35, 42, 49, 56 — then jumps 4 minutes to the next 0 of the next hour. Steps reset on each hour boundary. Use0,7,14,21,28,35,42,49,56if you want to be explicit. - Day-of-month 31 in months with 30 days. Cron silently skips. February with day 30 or 31 just won’t fire.
- Time zone confusion. Cron uses the system’s local time zone (usually UTC on Linux servers, sometimes local on workstations). AWS EventBridge defaults to UTC. Kubernetes CronJob defaults to the cluster’s time zone setting. Always confirm the time zone before relying on a schedule.
- Forgetting that
0 9 * * MON-FRIskips holidays. Cron doesn’t know about US Independence Day. Application logic must.
Cron implementations and their quirks
- Standard Unix cron (POSIX) — strict 5 fields, no macros, no seconds, no
?/L/Wcharacters. - GNU/Vixie cron (Debian, Ubuntu, RHEL) — accepts macros (
@daily). - Quartz cron (Java, Spring) — 6 or 7 fields including seconds and year. Different syntax for day-of-week. Supports
?,L(last),W(weekday-nearest). - AWS EventBridge — 6 fields, requires
?on either day-of-month or day-of-week (mutually exclusive). No0in day-of-week (uses1for Sunday). - Kubernetes CronJob — standard 5-field cron, no macros, no seconds.
This tool implements the standard 5-field syntax (Unix/Debian/K8s/EventBridge-compatible after stripping the EventBridge ?).
Privacy
Runs entirely in your browser. No expressions sent anywhere.