Cron every weekday at 08:30
Expression: 30 8 * * 1-5 — At 08:30, on weekdays (Monday to Friday).
At 08:30, on weekdays (Monday to Friday)
Next 5 runs in UTC, from 1 Jan 2026 (example)
When to use it
The range 1-5 in the last field limits a job to Monday through Friday, about 261 runs a year. It is the natural choice for stand-up reminders, morning sales reports, warming caches before customers arrive, and anything that should stay quiet at the weekend. Combined with a fixed minute and hour, the schedule reads almost like a sentence: at half past eight on working days. Remember that working days differ between countries; Friday and Saturday form the weekend in several Middle Eastern states, where 0-4 would be the equivalent range.
Field by field
| Field | Value | Meaning |
|---|---|---|
| Minute | 30 | only 30 |
| Hour | 8 | only 08:00 |
| Day of the month | * | every day of the month |
| Month | * | every month |
| Day of the week | 1-5 | only Monday, Tuesday, Wednesday, Thursday and Friday |
Real-world example
30 8 * * 1-5 /usr/local/bin/standup-reminder --channel engineering
Posts a stand-up reminder to chat on working days only, fifteen minutes before the meeting.
Variants
| Expression | Meaning |
|---|---|
0 9-17 * * 1-5 | At minute 0 past hour 9-17, on weekdays (Monday to Friday) — every hour from 09:00 to 17:00 on weekdays |
30 8 * * MON-FRI | At 08:30, on Monday, Tuesday, Wednesday, Thursday and Friday — same as 1-5 with names |
30 8 * * 0,6 | At 08:30, on weekends — the opposite: weekends only |
Pitfalls
- Cron knows nothing about public holidays. Skip them inside the script, using a holiday list for your country.
- Weekdays in UTC are not weekdays everywhere: Monday 00:30 UTC is still Sunday evening in the Americas.
- Some schedulers count weekdays differently (Quartz uses 1 for Sunday). Translate expressions when moving between tools.
Questions
How can colleagues in another country receive the reminder at their own 08:30?
Run one line per region with the zone set explicitly: CRON_TZ=Europe/Berlin in cronie, or separate Kubernetes CronJobs each with its own timeZone field. Daylight saving changes on different dates in Europe and North America.
Does 1-5 include Saturday?
No. 1 is Monday and 5 is Friday. Saturday is 6, and Sunday is 0 or 7, so weekends are written as 0,6 or SAT,SUN.
How do I skip public holidays?
Keep the cron line simple and check a holiday calendar at the start of the script. Store the list in the repository or fetch it from a trusted API once a year.
The same schedule elsewhere
- GitHub Actions:
on: schedule: - cron: '30 8 * * 1-5'. Always UTC, and runs can start several minutes late when runners are busy. - Kubernetes CronJob:
schedule: "30 8 * * 1-5"; setconcurrencyPolicy: Forbidto prevent overlapping pods andtimeZoneif you need local time. - Cloudflare Workers:
crons = ["30 8 * * 1-5"]under[triggers]in wrangler.toml, evaluated in UTC.
Before you deploy
Use absolute paths, because cron starts commands with a minimal PATH and without your shell profile. Make the job idempotent so a late or repeated run does no harm, log its exit code, and let a dead-man's-switch monitor alert you when an expected run never happens.