How to Read a Cron Expression
Cron expressions schedule recurring jobs, but the terse five-field syntax is easy to misread. Once you know the fields and the operators, any expression becomes readable. Here's the breakdown.
The five fields
A standard cron expression has five space-separated fields, in this order:
┌ minute (0–59)
│ ┌ hour (0–23)
│ │ ┌ day of month (1–31)
│ │ │ ┌ month (1–12)
│ │ │ │ ┌ day of week (0–6, Sunday = 0)
│ │ │ │ │
* * * * *
* * * * * means "every minute of every hour of every day" — a * is "any value" for that field.
Operators
Each field accepts more than a single number:
*/5— a step: every 5th value (*/5in the minute field is every 5 minutes)9-17— a range: 9 through 171,15— a list: the 1st and the 15th9-17/2— a step within a range: 9, 11, 13, 15, 17- Names also work in the last two fields:
JAN,MON
So */5 9-17 * * 1-5 is "every 5 minutes, from 9am to 5pm, Monday to Friday".
The day-of-month / day-of-week rule
This one trips people up. When both the day-of-month and day-of-week fields are restricted (neither is *), the job runs when either matches — not both. When only one is restricted, that one must match. It's the standard behavior inherited from Vixie cron.
Related
Part of The Complete Guide to Dates and Times. See the Unix Timestamp Converter for working with epoch times, and the Regex Tester for another compact syntax worth testing live.
Try it
Paste any cron expression to see it explained field by field, with the next five run times — everything runs in your browser, nothing uploaded.