What is a cron expression?
A cron expression is a compact, five-to-seven-field string that tells a scheduler when to run a job. The classic POSIX form has five fields, minute, hour, day-of-month, month, day-of-week, separated by spaces. 0 9 1-5 means "9:00 AM, Monday through Friday". Quartz-style cron adds a leading seconds field; some implementations append a trailing year field for long-range scheduling.
Cron expressions are everywhere: crontab, systemd timers, Kubernetes CronJobs, GitHub Actions schedules, AWS EventBridge rules, Vercel cron, Cloudflare Workers cron triggers, n8n schedule nodes, Airflow DAGs. The syntax is the same in all of them, but the small dialect differences (5 vs 6 vs 7 fields, ? placeholders, L last-day, # nth-weekday) trip people up constantly.
How to use this tool
1. Paste your cron expression into the input. Five-field POSIX is the default; the parser auto-detects 6-field (with seconds) and 7-field (with year) forms. 2. Read the plain-English explanation below the input, it spells out exactly which minutes, hours, days, and weekdays the expression matches. 3. Check the field-by-field validation panel, each field shows ✓ if it parses or a specific error if it doesn't (e.g. "Hour: 24 is out of range, must be 0–23"). 4. Inspect the next six firings in the preview list. Toggle between UTC and your local timezone to confirm what your scheduler actually sees vs what your team will experience. 5. Click a preset in the patterns card to load common expressions (every minute, hourly, daily at midnight, weekdays at 9 AM, monthly, etc.), useful as a starting point or a sanity check. 6. Download an .ics calendar file of the next firings, paste it into Google Calendar, Outlook, or Apple Calendar to visualise the schedule alongside the rest of your week.
Cron field reference
| Field | Range | Notes |
|---|---|---|
| Seconds | 0–59 | Quartz only (6/7-field). |
| Minute | 0–59 | |
| Hour | 0–23 | 24-hour clock. |
| Day of month | 1–31 | `?` allowed in Quartz when DOW is set. |
| Month | 1–12 or `jan`–`dec` | Aliases case-insensitive. |
| Day of week | 0–6 or `sun`–`sat` | 0 = Sunday in POSIX. |
| Year | 1970–2099 | 7-field only. |
Each field accepts: a single value (5), a list (1,3,5), a range (1-5), a step over a range (/15 = every 15, 0-30/5 = 0,5,10,…,30), or any combination joined with commas (0-30/5,45). The wildcard means "every value in the field's range".
Common patterns, decoded
*, every minute, forever. Almost never what you want in production./15 *, every 15 minutes (:00,:15,:30,:45).0, top of every hour.0 9 1-5, 9:00 AM, Monday through Friday.0 0 0, midnight every Sunday.0 0 1, midnight on the 1st of each month.0 0 1 1 *, New Year's Day at midnight.30 2 1, 2:30 AM every Monday (a classic backup window).
Common gotchas
- Day-of-month vs day-of-week is OR, not AND.
0 0 1 * 1fires at midnight on either the 1st of any month or any Monday, not just Mondays that fall on the 1st. To restrict to "first Monday of the month" you need cron extensions (#) or a wrapper script that checks the date. - Sunday is 0 in POSIX, 1 in Quartz. Off-by-one weekday bugs are the single most common cron mistake. If you copy a Quartz expression into a POSIX scheduler (or vice versa), Sunday-vs-Monday will silently shift by one.
- Timezone matters. Most schedulers run cron in UTC unless you explicitly set a timezone.
0 9 *is 9:00 AM UTC, which is 4:00 AM Eastern in winter and 5:00 AM in summer. The "Local" toggle in this tool shows you what the firings will look like in your browser's timezone. - *
/7 doesn't mean "every 7 days".* Step expressions reset at the start of each higher-level period./7 in the day-of-month field fires on the 1st, 8th, 15th, 22nd, 29th, and then again on the 1st of the next month, breaking the 7-day cadence. - Seconds field is silently ignored by POSIX cron. If your scheduler is plain
crontaband you paste in a 6-field Quartz expression, the first field is interpreted as minutes, your job runs an order of magnitude more often than you intended.
Privacy
Your cron expressions and the firing previews are computed entirely in your browser. Nothing is uploaded. Recent expressions are stored only in your browser's localStorage and you can clear them from the Recent card. The .ics export is generated locally and downloaded directly from your machine.