Reading the five fields
0 9 * * 1-5 = minute 0, hour 9, any day of the month, any month, day of week 1-5. Weekdays are numbered from Sunday: 0 (and 7) is Sunday, 1 Monday … 6 Saturday. Most crons also accept names: 0 9 * * MON-FRI.
Common variations
30 9 * * 1-5 9:30, Monday–Friday
0 9,17 * * 1-5 9:00 and 17:00 on weekdays
0 9 * * 6,0 9:00 on weekends
0 9 1-7 * 1 trap: NOT "first Monday" – see below
When both day-of-month and day-of-week are restricted, classic cron runs if either matches. 0 9 1-7 * 1 therefore fires on days 1–7 and on every Monday. The explainer above spells this out.
Questions
Which time zone does 9 AM refer to?
The time zone of the machine running cron. GitHub Actions and most cloud schedulers use UTC; Kubernetes CronJobs accept a timeZone field. Pick a time zone above to see the next runs there and in your local time.
Does the job skip public holidays?
No – cron only knows the calendar. Skip holidays in the script itself, for example by checking a list of dates before doing work.
What about daylight saving time?
On the night clocks change, a local 9:00 still runs once on most systems, but jobs scheduled inside the skipped or repeated hour (often 2:00–3:00) may run twice or not at all. Schedule in UTC to avoid surprises.