Cron recipe
Cron every weekday: 0 9 * * 1-5 and day-of-week numbers
The expression
0 9 * * 1-5Paste it into crontab -e, your platform cron config, or tool.crontap.com/cronjob-debugger to preview the next runs.
What it does
0 9 * * 1-5 runs at 09:00 Monday to Friday and skips Saturday and Sunday. Read it left to right: minute 0, hour 9, any day of the month, any month, and day of week 1 through 5. MON-FRI is the same schedule written with names. The 09:00 is in the scheduler's timezone, which is UTC on most hosted platforms.
Which number is which day
Standard cron starts the week at Sunday = 0. Quartz and AWS EventBridge start at Sunday = 1, which shifts every weekday by one.
| Day | Standard cron | Quartz and AWS | Name |
|---|---|---|---|
| Sunday | 0, or 7 in Linux cron, Cloud Scheduler and Crontap | 1 | SUN |
| Monday | 1 | 2 | MON |
| Tuesday | 2 | 3 | TUE |
| Wednesday | 3 | 4 | WED |
| Thursday | 4 | 5 | THU |
| Friday | 5 | 6 | FRI |
| Saturday | 6 | 7 | SAT |
Monday to Friday is 1-5 in standard cron and 2-6 in Quartz and AWS. Vercel is the one scheduler on this page that rejects the names.
When to use it
Standup prompts and morning digests
Post the agenda, open incidents or yesterday's numbers to Slack when people are at their desks, and stay quiet on weekends.
Business-day syncs with a partner API
Pull orders, rates or tickets on the days the other side publishes them.
Reports someone has to act on
Approval queues and exception reports that nobody opens on a Saturday, so they don't pile up unread over the weekend.
Common variations
0 9 * * MON-FRIThe same schedule with names. Works in Linux cron, Kubernetes, Google Cloud Scheduler and Crontap, but not on Vercel, which only accepts numbers.
30 8 * * 1-508:30 Monday to Friday. Change the first two fields to move the time; the 1-5 stays.
0 17 * * 517:00 every Friday. Day 5 is Friday in standard cron.
*/15 9-17 * * 1-5Every 15 minutes from 09:00 to 17:45 on weekdays. On Crontap this needs a paid plan, since Starter's shortest interval is 1 hour.
Same schedule in other schedulers
| Platform | Expression | Note |
|---|---|---|
| Linux crontab (cronie, Debian, Ubuntu) | 0 9 * * 1-5 | MON-FRI works too. Host timezone; cronie also reads CRON_TZ. |
| Crontap | 0 9 * * 1-5 | MON-FRI works too. Each schedule has its own IANA timezone. |
| Kubernetes CronJob | 0 9 * * 1-5 | Names work, 7 doesn't. Set .spec.timeZone, or the cluster control plane's local zone applies. |
| systemd timer | OnCalendar=Mon..Fri *-*-* 09:00:00 | Day names, not numbers. Host timezone unless you add a zone name after the time. |
| GitHub Actions | 0 9 * * 1-5 | UTC unless the schedule entry sets timezone: (IANA, since March 2026). Runs can start late at busy times. |
| Vercel Cron | 0 9 * * 1-5 | Numbers only, always UTC. On Hobby it fires somewhere in the 09:00 hour (as of 2026-10). |
| AWS EventBridge | cron(0 9 ? * MON-FRI *) | Or 2-6, because Sunday is 1. ? is required. Scheduler takes an IANA timezone; legacy rules run in UTC. |
| Quartz (Java) | 0 0 9 ? * MON-FRI | Seconds come first and Sunday is 1. One day field must be ?. |
| Google Cloud Scheduler | 0 9 * * 1-5 | MON-FRI and 7 are accepted. Default UTC; set --time-zone. |
Where this schedule goes wrong
Sunday as 7 doesn't travel
Kubernetes CronJob rejects
7with "end of range (7) above maximum (6)", BusyBox crond logs "parse error at 7", and GitHub Actions and Vercel only document0to6. Write0, orSUNwhere names are allowed, if the line has to travel.Vercel refuses day names, Linux cron takes them
Vercel's docs say cron jobs there don't support
MON,SUN,JANorDEC, so write1-5. Linux cron takesMON-FRI, even though the Debian 12 and 13 man pages say ranges of names aren't allowed. The parser accepts them (tested on Ubuntu 24.04), and Debian corrected the page in cron 3.0pl1-201.09:00 is in the scheduler's timezone, not yours
Linux cron uses the host's zone, while GitHub Actions, Vercel, Cloud Scheduler and EventBridge rules default to UTC, and Vercel can't change it. Early UTC hours also move the day: a Monday 02:00 UTC run is still Sunday evening in New York, so
0 2 * * 1-5in UTC fires Sunday to Thursday there.Weekdays still include public holidays
No cron dialect knows holidays, so
1-5fires on Christmas Day when it falls on a weekday. Keep a holiday list in the endpoint and return early on those dates.
Run this with Crontap
If the weekday job is an HTTP endpoint, Crontap can call it at 09:00 in your team's timezone, record each run's status code and duration, and alert you when it fails.
Related recipes
- every Monday at 9am
0 9 * * 1 - weekday business hours
0 9-17 * * 1-5 - every Sunday
0 3 * * 0 - the first day of every month
0 0 1 * *
More patterns in the cron syntax cheat sheet and what is a cron job in Linux.
Related reading
FAQ
- What is the cron expression for every weekday?
- Use 0 9 * * 1-5 (standard five-field cron). Verify the next run times in the free cron debugger before you deploy.
- Is day of week 1 Monday in crontab?
- Yes. Crontab counts the week from Sunday as 0, so 1 is Monday and 5 is Friday, and Linux cron also accepts 7 as Sunday.
- What does 1-5 mean in the day-of-week field?
- It is an inclusive range from Monday (1) through Friday (5), so 0 9 * * 1-5 runs at 09:00 Monday to Friday. It means the same as 1,2,3,4,5 or MON-FRI, except on Vercel, which only accepts the numbers.
- Is Sunday 0 or 7 in cron?
- Both, in cronie, Debian and Ubuntu cron, Google Cloud Scheduler and Crontap. Kubernetes CronJob only accepts 0 to 6, and GitHub Actions and Vercel document 0 to 6, so use 0 if the line has to work in every five-field scheduler.
- What is day of week 5 in crontab?
- Friday. 0 17 * * 5 runs at 17:00 every Friday. In Quartz and AWS EventBridge 5 is Thursday, so write FRI or 6 there.
- Can Crontap run this schedule?
- Yes, and it fits the free Starter plan because it runs once a day. Paste 0 9 * * 1-5 or 0 9 * * MON-FRI, pick the schedule's timezone (an IANA name like America/New_York) so 09:00 means your team's 09:00, and use Perform test to call the URL once before you save. New schedules retry 5xx responses, timeouts and network failures with backoff, then send a failure alert by email, at most once a day on Starter. Pro, from $2.99/mo, adds Slack, Discord and Telegram alerts, alert intervals down to 1 minute and schedules as often as every minute.