All recipes

Cron recipe

Cron every weekday: 0 9 * * 1-5 and day-of-week numbers

The expression

five-field cron
0 9 * * 1-5

Paste 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.

Which number is which day
DayStandard cronQuartz and AWSName
Sunday0, or 7 in Linux cron, Cloud Scheduler and Crontap1SUN
Monday12MON
Tuesday23TUE
Wednesday34WED
Thursday45THU
Friday56FRI
Saturday67SAT

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-FRI

    The 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-5

    08:30 Monday to Friday. Change the first two fields to move the time; the 1-5 stays.

  • 0 17 * * 5

    17:00 every Friday. Day 5 is Friday in standard cron.

  • */15 9-17 * * 1-5

    Every 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

Same schedule in other schedulers
PlatformExpressionNote
Linux crontab (cronie, Debian, Ubuntu)0 9 * * 1-5MON-FRI works too. Host timezone; cronie also reads CRON_TZ.
Crontap0 9 * * 1-5MON-FRI works too. Each schedule has its own IANA timezone.
Kubernetes CronJob0 9 * * 1-5Names work, 7 doesn't. Set .spec.timeZone, or the cluster control plane's local zone applies.
systemd timerOnCalendar=Mon..Fri *-*-* 09:00:00Day names, not numbers. Host timezone unless you add a zone name after the time.
GitHub Actions0 9 * * 1-5UTC unless the schedule entry sets timezone: (IANA, since March 2026). Runs can start late at busy times.
Vercel Cron0 9 * * 1-5Numbers only, always UTC. On Hobby it fires somewhere in the 09:00 hour (as of 2026-10).
AWS EventBridgecron(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-FRISeconds come first and Sunday is 1. One day field must be ?.
Google Cloud Scheduler0 9 * * 1-5MON-FRI and 7 are accepted. Default UTC; set --time-zone.

Where this schedule goes wrong

  • Sunday as 7 doesn't travel

    Kubernetes CronJob rejects 7 with "end of range (7) above maximum (6)", BusyBox crond logs "parse error at 7", and GitHub Actions and Vercel only document 0 to 6. Write 0, or SUN where 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, JAN or DEC, so write 1-5. Linux cron takes MON-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-5 in UTC fires Sunday to Thursday there.

  • Weekdays still include public holidays

    No cron dialect knows holidays, so 1-5 fires 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

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.