Cron expressions explained: the 5 fields and common schedules

6 min readUpdated May 24, 2026

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 midnight

The 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.