Tidy Dev Tools

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

FieldValueMeaning
Minute30only 30
Hour8only 08:00
Day of the month*every day of the month
Month*every month
Day of the week1-5only 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

ExpressionMeaning
0 9-17 * * 1-5At minute 0 past hour 9-17, on weekdays (Monday to Friday) — every hour from 09:00 to 17:00 on weekdays
30 8 * * MON-FRIAt 08:30, on Monday, Tuesday, Wednesday, Thursday and Friday — same as 1-5 with names
30 8 * * 0,6At 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"; set concurrencyPolicy: Forbid to prevent overlapping pods and timeZone if 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.

Other schedules