Cron expressions schedule recurring jobs on Unix systems and in tools like GitHub Actions, Kubernetes, and cloud schedulers. They are compact but easy to misread โ one wrong field and your nightly backup runs every minute. This guide explains the field order, then walks through the schedules people actually use, each with a plain-English translation. If you have an expression you need decoded, paste it into the free cron explainer.
The five fields, in order
A standard cron expression has five fields separated by spaces:
- Minute (0โ59)
- Hour (0โ23)
- Day of month (1โ31)
- Month (1โ12)
- Day of week (0โ7, where both 0 and 7 mean Sunday)
A star (*) means "every possible value" for that field. A slash sets a step (*/5 means every 5), a dash sets a range (1-5 means Monday through Friday), and commas list values (6,0 means Saturday and Sunday). Note that standard cron has no seconds field โ if your expression has six fields, it is using an extended format.
12 common cron schedules
| Expression | Plain-English meaning |
|---|---|
* * * * * | Every minute |
*/5 * * * * | Every 5 minutes |
0 * * * * | At the start of every hour |
*/15 9-17 * * 1-5 | Every 15 minutes, 9 AM to 5 PM, Monday to Friday |
0 9 * * * | Every day at 9:00 AM |
30 2 * * * | Every day at 2:30 AM |
0 0 * * 0 | Every Sunday at midnight |
0 8 * * 1 | Every Monday at 8:00 AM |
0 0 1 * * | On the 1st of every month at midnight |
0 12 15 * * | On the 15th of every month at noon |
0 0 * * 6,0 | Every Saturday and Sunday at midnight |
0 6 1 1 * | Once a year: January 1st at 6:00 AM |
How to read any cron expression
Read left to right and translate each field: the first number is the minute past the hour, the second is the hour of the day, then the day constraints narrow it down. So 30 14 * * 1-5 is "30 minutes past hour 14, any day of the month, any month, Monday through Friday" โ every weekday at 2:30 PM. When the day-of-month and day-of-week fields are both restricted, most cron implementations treat it as OR, not AND, which is a classic source of surprises.
Common gotchas
Three mistakes cause most cron headaches. First, timezones: cron runs in the server's timezone, often UTC, not your local time โ a job set for "9 AM" may fire at 2 AM your time. Second, the day-of-month versus day-of-week OR behavior described above. Third, environment: cron jobs run with a minimal environment, so scripts that work in your terminal can fail under cron because PATH or environment variables are missing. Always log output somewhere you will actually check.
Frequently asked questions
What do the five fields in a cron expression mean?
In order: minute (0โ59), hour (0โ23), day of month (1โ31), month (1โ12), and day of week (0โ7, where both 0 and 7 mean Sunday). A star means every possible value for that field.
Why does my cron job run at unexpected times?
The most common causes are confusing day-of-month with day-of-week, forgetting the server runs in UTC rather than your local timezone, and assuming seconds are included โ standard cron has no seconds field.
How do I check what a cron expression means?
Paste it into a cron explainer tool, which translates the expression into a plain-English sentence like "every Monday at 8:00 AM", so you can verify it before deploying.