Cron Every Weekday
To run cron every weekday, put 1-5 in the day-of-week field. Pick the days and time below, and check how your platform numbers Sunday before you copy the result.
The short answer
To run cron every weekday, put 1-5 in the day-of-week field. 0 9 * * 1-5 runs at 9:00 AM Monday to Friday. Use 0 for every Sunday and 1 for every Monday.
0 9 * * 1-5Runs at 9:00 AM every weekday (Mon-Fri).
Pick the days and the time
Toggle the days, set the time, then choose the platform. The picker writes the weekday numbers that platform expects.
Cron every weekday: 1-5
Monday to Friday is the range 1 to 5 in the day-of-week field of Linux-style cron. Day-of-month and month stay *. On platforms that accept names you can write MON-FRI, which is easier to review and avoids the numbering differences below.
The same schedule on EventBridge is cron(0 9 ? * MON-FRI *) and on Quartz it is 0 0 9 ? * MON-FRI. Both use names here because their numbers start at 1 for Sunday.
Cron every Sunday, every Monday and other days
For a single day, put its number in the field. Lists use commas and ranges use hyphens, and you can combine them.
| Expression | What it does | Use |
|---|---|---|
0 0 * * 0 | Runs at 12:00 AM every Sunday. Every Sunday at midnight. 7 also means Sunday on Linux. | Open |
0 8 * * 1 | Runs at 8:00 AM every Monday. Every Monday at 8:00. | Open |
0 9 * * 1,3,5 | Runs at 9:00 AM every Monday, Wednesday and Friday. Monday, Wednesday and Friday. | Open |
0 10 * * 0,6 | Runs at 10:00 AM every weekend day (Sat and Sun). Weekends. | Open |
0 17 * * 5 | Runs at 5:00 PM every Friday. Friday afternoons. | Open |
0 9 * * 1-5 | Runs at 9:00 AM every weekday (Mon-Fri). Weekdays. | Open |
Day-of-week numbers by platform
This is where weekly schedules go wrong. The numbers are not the same everywhere, and a Quartz expression copied to Linux runs one day late.
| Platform | Sunday | Monday | Friday | Saturday | Names |
|---|---|---|---|---|---|
| Linux, Unix | 0 (and 7) | 1 | 5 | 6 | SUN-SAT |
| Kubernetes | 0 | 1 | 5 | 6 | SUN-SAT |
| GitHub Actions | 0 | 1 | 5 | 6 | SUN-SAT |
| Vercel | 0 | 1 | 5 | 6 | not accepted |
| AWS EventBridge | 1 | 2 | 6 | 7 | SUN-SAT |
| Quartz | 1 | 2 | 6 | 7 | SUN-SAT |
| Spring | 0 (and 7) | 1 | 5 | 6 | SUN-SAT |
If the platform accepts names, use them. Vercel does not, so check its number table twice.
The day-of-month trap
People try to say "the first Monday of the month" as 0 9 1-7 * 1. On Linux it means: Runs at 9:00 AM on days 1, 2, 3, 4, 5, 6 and 7 of every month and every Monday (either one triggers a run). Restricting both day fields makes the job run when either matches, so it fires on days 1 to 7 and on every Monday.
Plain cron cannot express the first Monday. Quartz and EventBridge can: MON#1. On Linux, schedule every Monday and let the command check the date:
0 9 * * 1 [ "$(date +\%d)" -le 7 ] && /path/to/job.shThe backslash before the percent sign is required inside a crontab. See the first day of month page.
Vercel avoids the trap by refusing the combination.
What cron cannot do: every other week
Cron has no "every second Monday". A step in the day-of-week field repeats within a week, not across weeks. To run fortnightly, schedule weekly and have the job exit unless the week number is even, or use a platform that supports intervals.
Time zones can move the weekday
If the scheduler runs in UTC, converting a late-evening local time can move the run to the next UTC day, and then the weekday number changes too. The cron timezone converter adjusts the day for you.
Sources and further reading
Use a tool
Try the schedule from this page in a tool.