0 9 * * 1-5Fields
| Minute | 0 | 0 |
|---|---|---|
| Hour | 9 | 9 |
| Day of month | * | any |
| Month | * | any |
| Day of week | 1-5 | 1, 2, 3, 4, 5 |
Where to use it
| crontab | 0 9 * * 1-5 /path/to/script.sh |
|---|---|
| GitHub Actions | - cron: "0 9 * * 1-5" (on.schedule) |
| Kubernetes CronJob | schedule: "0 9 * * 1-5" |
crontab runs in the server’s time zone; GitHub Actions always uses UTC.
Good to know
0 9 * * 1-5 runs at 09:00 Monday to Friday; most crons also accept MON-FRI. The time zone is the big trap: a 9 am report on a UTC server arrives at 10:00 or 11:00 in Central Europe depending on daylight saving, and GitHub Actions always uses UTC. Pin local time with CRON_TZ=Europe/Warsaw in cronie, or spec.timeZone in a Kubernetes CronJob.
Cron knows nothing about public holidays, so check a holiday list inside the script and exit early. Don’t combine day-of-month with day-of-week to mean “first weekday of the month”: when both fields are restricted, cron runs if either matches, so 0 9 1 * 1-5 fires on the 1st and on every weekday. For 9:00 and 17:00 on weekdays, write 0 9,17 * * 1-5.