Cron expressions explained: the 5 fields and common schedules
Cron is the scheduler behind most recurring jobs on Unix systems and CI platforms. Its five-field syntax looks cryptic but follows a simple pattern. This guide decodes it and gives you schedules you can paste straight in.
The five fields
A standard cron expression has five space-separated fields, read left to right:
┌── minute (0-59)
│ ┌── hour (0-23)
│ │ ┌── day of month (1-31)
│ │ │ ┌── month (1-12)
│ │ │ │ ┌── day of week (0-6, Sun=0)
│ │ │ │ │
* * * * *A * means "every". So * * * * * runs every minute. Build and explain any expression in the Cron Builder.
Special characters
*— every value.,— a list:1,15,30.-— a range:9-17(9am through 5pm)./— a step:*/5(every 5th),0/15(every 15 from 0).?— "no specific value" (some schedulers, in day fields).
Schedules to copy
*/5 * * * * every 5 minutes
0 * * * * every hour, on the hour
0 9 * * * every day at 09:00
0 9 * * 1-5 weekdays at 09:00
0 0 1 * * midnight on the 1st of each month
0 0 * * 0 every Sunday at midnightThe gotchas
When both day-of-month and day-of-week are restricted (neither is *), most cron implementations treat them as OR, not AND — the job runs if *either* matches. This surprises almost everyone.
Cron uses the server’s timezone unless configured otherwise. A "9am" job can fire at the wrong local time after a DST change — pin a timezone if it matters.
Frequently asked questions
- What does */5 mean in cron?
- A step value: run every 5th unit. In the minute field, */5 means every 5 minutes. 0/15 means every 15 starting from 0.
- Why does my cron job with both day-of-month and day-of-week run too often?
- When both day fields are set, standard cron ORs them — the job runs if either matches. To require both, restrict only one field.
- What timezone does cron use?
- By default the system/server timezone. On platforms like Vercel or GitHub Actions, cron typically runs in UTC. Check your platform and set a timezone explicitly when needed.
- How do I run a job once a day?
- Set minute and hour, leave the rest as *. For example 0 9 * * * runs daily at 09:00.
Try it yourself
Put this guide into practice — these tools run free in your browser.