How to read a cron expression
Five space-separated fields, left to right: minute, hour, day of month, month, day of week. * means every value, */n every n-th value, a-b a range and a,b a list.
| Field | Allowed values | Examples |
|---|---|---|
| Minute | 0–59 | */15 (every 15 minutes), 0 (on the hour) |
| Hour | 0–23 | 9-17 (09:00 to 17:00), */6 (every 6 hours) |
| Day of month | 1–31 | 1 (the 1st), 1,15 (1st and 15th) |
| Month | 1–12 or JAN–DEC | */3 (every quarter), JAN (January) |
| Day of week | 0–7 or SUN–SAT (0 and 7 are Sunday) | 1-5 (Mon–Fri), 6,0 (weekend) |
Minutes
Every minute
* * * * *
Runs at the start of every minute, 1,440 times a day.
Every 5 minutes
*/5 * * * *
Runs at :00, :05, :10 and so on through :55 of every hour.
Every 10 minutes
*/10 * * * *
Runs six times an hour, at :00, :10, :20, :30, :40 and :50.
Every 15 minutes
*/15 * * * *
Runs at :00, :15, :30 and :45 of every hour.
Every 30 minutes
*/30 * * * *
Runs twice an hour, on the hour and at half past.
Hours
Daily
Every day at midnight
0 0 * * *
Runs once a day at 00:00 in the scheduler's timezone.
Every day at noon
0 12 * * *
Runs once a day at 12:00.
Every day at 2 AM
0 2 * * *
Runs once a day at 02:00, the traditional maintenance window.
Twice a day
0 8,20 * * *
Runs at 08:00 and 20:00 every day.
Weekly
Every weekday at 9 AM
0 9 * * 1-5
Runs at 09:00 Monday to Friday.
Every Monday
0 0 * * 1
Runs once a week, at 00:00 on Monday.
Every Friday at 5 PM
0 17 * * 5
Runs once a week at 17:00 on Friday.
Every Sunday
0 0 * * 0
Runs once a week at 00:00 on Sunday.
Every weekend
0 10 * * 6,0
Runs at 10:00 on Saturday and Sunday.
Hourly during business hours
0 9-17 * * 1-5
Runs on the hour from 09:00 to 17:00, Monday to Friday.
Monthly and yearly
First day of every month
0 0 1 * *
Runs at 00:00 on the 1st of every month.
Last day of the month
0 0 28-31 * *
Runs on the 28th, 29th, 30th and 31st; the command itself decides whether today is the last day.
Twice a month (1st and 15th)
0 0 1,15 * *
Runs at 00:00 on the 1st and the 15th of every month.
Every quarter
0 0 1 */3 *
Runs at 00:00 on 1 January, 1 April, 1 July and 1 October.
Once a year
0 0 1 1 *
Runs at 00:00 on 1 January.
Special strings
Most Unix crons accept these shortcuts in place of the five fields. GitHub Actions and AWS EventBridge do not, so prefer the explicit form when a schedule may move between systems.
| Shortcut | Equivalent |
|---|---|
| @hourly | 0 * * * * |
| @daily / @midnight | 0 0 * * * |
| @weekly | 0 0 * * 0 |
| @monthly | 0 0 1 * * |
| @yearly / @annually | 0 0 1 1 * |
| @reboot | once, at scheduler start |
Platform differences
The five-field syntax is shared, but timezones, minimum intervals and extensions differ. Check this before copying an expression from one system to another.
| Platform | Fields | Timezone | Notes |
|---|---|---|---|
| Linux / macOS crontab | 5 | System timezone (CRON_TZ or TZ can override in cronie) | Shortcuts like @daily are supported. Escape % as \% in commands. |
| Kubernetes CronJob | 5 | UTC by default; spec.timeZone since 1.27 | Set concurrencyPolicy to Forbid to avoid overlapping runs. |
| GitHub Actions | 5 | UTC only | Minimum interval 5 minutes; runs may be delayed; default branch only; no @ shortcuts. |
| AWS EventBridge | 6 (adds year) | UTC | Uses cron(…) with ? in day-of-month or day-of-week; different syntax, do not paste five-field expressions. |
| Vercel / Netlify scheduled functions | 5 | UTC | Free tiers limit frequency (Vercel Hobby: once per day). |
| Quartz / Spring / Jenkins | 6–7 (seconds first) | Configurable | Extended syntax with L, W and #; Jenkins adds H for hashed spreading. |
FAQ
What are the five fields of a cron expression?
Minute (0–59), hour (0–23), day of month (1–31), month (1–12) and day of week (0–6, Sunday is 0 and usually also 7), separated by spaces. An asterisk means every value.
What does */5 mean?
Every fifth value of the field, counted from its minimum. In the minute field that is 0, 5, 10 … 55; in the hour field 0, 5, 10, 15, 20.
Does cron use my timezone?
It uses the scheduler's timezone: the system timezone for a Linux crontab, UTC for GitHub Actions, and UTC for Kubernetes CronJobs unless spec.timeZone is set.
Why does my job run more often when I set both day of month and day of week?
Because standard cron treats them with OR: the job runs when either field matches. 0 0 13 * 5 fires on every 13th and on every Friday.
Can cron run every 30 seconds?
No. One minute is the smallest unit. Use a systemd timer, or run every minute and sleep 30 seconds inside the script for a second pass.
Want to build your own? Open the Cron Expression Generator or read the Cron Expression Examples and How to Build One tutorial.