Unix Crontab Expression Parser
The five-field form you put in a crontab: minute, hour, day of month, month, day of week. This page opens with the Unix dialect selected, so day-of-week is numbered 0-6 from Sunday and 7 is accepted as Sunday too.
Paste an expression to get a plain-English reading and the next fire times.
The fields
Names work too and read far better than numbers: JAN-DEC in the month field, SUN-SAT in day of week.
*/5 9-17 * * 1-5
│ │ │ │ └ day of week (0-6, Sun=0)
│ │ │ └── month (1-12)
│ │ └──── day of month (1-31)
│ └──────── hour (0-23)
└───────────── minute (0-59)The two day fields are ORed, not ANDed
When both day-of-month and day-of-week are restricted, cron runs the job if either matches. So 0 0 1 * MON means the first of the month and also every Monday - not "the first, when it falls on a Monday". They combine as you would expect only when one of the two is a wildcard.
This surprises people constantly, and it is the reason Quartz introduced a separate no-value marker.
Daylight saving eats jobs
Classic cron runs in the system timezone. A job scheduled for 02:30 does not run at all on the day the clocks skip that hour, and may run twice on the day the hour repeats. Scheduling in UTC avoids both, or use a scheduler with explicit timezone support.
Special strings and environment
A crontab also accepts shorthand macros: @daily, @hourly, @weekly, @monthly, @yearly and @reboot. They expand to ordinary expressions and are considerably easier to read than the numeric equivalents.
Remember that cron runs with a minimal environment. A job that works in your shell and fails under cron is nearly always missing PATH or a variable your profile sets.