Weekdays at 9 AM
0 9 * * 1-5 0 0 9 ? * MON-FRI 0 9 * * 1-5 0 9 ? * MON-FRI * 0 0 9 * * MON-FRI 0 9 * * 1-5 Runs at 09:00 Monday through Friday — 5 invocations per week, skipping Saturday and Sunday.
Use in your stack
# Weekdays at 9 AM, server timezone
0 9 * * 1-5 /usr/local/bin/morning-standup.sh
# Pin to US Pacific time
CRON_TZ=America/Los_Angeles
0 9 * * MON-FRI /usr/local/bin/morning-standup.sh
{ "cron": "0 0 9 ? * MON-FRI", "timezone": "UTC" }
apiVersion: batch/v1
kind: CronJob
metadata:
name: morning-standup
spec:
schedule: "0 9 * * 1-5"
timeZone: "America/Los_Angeles"
jobTemplate:
spec:
template:
spec:
containers:
- name: standup
image: my-image:latest
restartPolicy: OnFailure
cron(0 9 ? * MON-FRI *)
@Scheduled(cron = "0 0 9 * * MON-FRI", zone = "America/Los_Angeles")
public void weekdayMorning() { /* ... */ }
on:
schedule:
- cron: '0 9 * * 1-5' # 09:00 UTC, Mon-Fri
Next runs
Pick a timezone to see when this expression fires next.
Next 10 runs
- 012026-07-06T09:00:00.000Z
- 022026-07-07T09:00:00.000Z
- 032026-07-08T09:00:00.000Z
- 042026-07-09T09:00:00.000Z
- 052026-07-10T09:00:00.000Z
- 062026-07-13T09:00:00.000Z
- 072026-07-14T09:00:00.000Z
- 082026-07-15T09:00:00.000Z
- 092026-07-16T09:00:00.000Z
- 102026-07-17T09:00:00.000Z
Variations
Common use cases
- Daily team standup digest emails.
- Morning ticket-queue summaries for support teams.
- Workday-only operational dashboards or KPI rollups.
- Triggering an internal ETL that prepares dashboards for the working day.
Gotchas
- Day-of-week numbering: Unix uses `1-5` (Mon-Fri, with Sun=0). Quartz uses `MON-FRI` or `2-6` (Sun=1). When in doubt, use name form (`MON-FRI`) — it works in every dialect.
- Timezone matters more than usual — "9 AM weekdays" is meaningful only in the user's local timezone. Pin the timezone explicitly.
- On US holidays, this schedule still fires — cron has no concept of holidays. Either gate inside your script with a calendar check or accept that the daily message goes out on July 4th too.
- AWS EventBridge: `0 9 ? * MON-FRI *` (use `?` for day-of-month and prefer name form).
0 9 * * 1-5 is the most-written business-hours cron expression. It encodes “make this happen at the start of every workday” — assuming a Monday-through-Friday workweek, no holidays, and a known timezone. The first two assumptions are usually safe; the third often isn’t.
Frequently asked questions
What does `0 9 * * 1-5` mean?
Minute `0`, hour `9`, day-of-month `*` (any), month `*` (any), day-of-week `1-5` (Monday through Friday in Unix dialects where Sun=0). So the job fires at 09:00 on every weekday.
What's the difference between `1-5` and `MON-FRI` in the day-of-week field?
Functionally identical. `1-5` uses numeric day codes (Sun=0, Mon=1, …, Sat=6 in Unix cron). `MON-FRI` uses three-letter name codes. Names are case-insensitive and avoid the off-by-one confusion between dialects — Quartz uses `1-7` with Sun=1, so its weekday range is `2-6`. Names work the same everywhere.
How does Quartz express "weekdays at 9 AM"?
`0 0 9 ? * MON-FRI` — six fields (seconds at front, day-of-week as name range), with `?` in day-of-month because day-of-week is set. The numeric form is `0 0 9 ? * 2-6` since Quartz uses Sun=1.
Will this fire on holidays?
Yes. Standard cron has no holiday calendar — it only knows weekdays vs weekends by day-of-week. If you want to skip holidays, gate inside your job script with a date check (e.g., `date +%Y-%m-%d | grep -q -f holidays.txt && exit 0`), or use a more capable scheduler like AWS Step Functions or Apache Airflow that supports holiday-aware schedules.
How do I run at 9 AM EVERY day including weekends?
Use `0 9 * * *` (no day-of-week restriction). The asterisk in the last field means "any day of the week." See the [daily at 9 AM pattern](/daily-at-9am) for the full reference.
Browse all cron patterns
Every schedule Cronuru documents, with its expression and code snippets for six dialects.