Cron expression for Every weekday
0 0 * * 1-5
Runs at midnight Monday through Friday; skips weekends.
Next 5 runs (your local time)
These are shown in your browser’s timezone. The job itself runs in the scheduler’s timezone — often UTC — so the real run time can differ.
What people actually schedule with 0 0 * * 1-5
- Sending a daily standup digest or task summary to a team channel only on working days, so nobody gets a Saturday ping at midnight
- Generating SLA or support-queue reports that should only accumulate business days, since weekend volume is near zero and skews the numbers
- Running a nightly batch import from a partner system that only updates their feed on business days, so weekend runs would just reprocess stale data
Use 0 0 * * 1-5 on your platform
It’s the same 5-field expression everywhere — what changes is where you put it and which timezone it runs in.
Linux / crontab
0 0 * * 1-5 /path/to/your-command
Runs in the server’s local timezone — check it with timedatectl.
Full field reference: crontab(5) man page.
GitHub Actions
on:
schedule:
- cron: "0 0 * * 1-5"
GitHub Actions always runs scheduled jobs in UTC — there is no timezone setting, and runs can be delayed under load (official docs).
Kubernetes CronJob
spec:
schedule: "0 0 * * 1-5"
Defaults to UTC. Set spec.timeZone (Kubernetes 1.27+)
for a specific zone — see the
CronJob docs.
Quartz / Spring @Scheduled
Quartz uses 6 fields (seconds first): 0 0 0 * * 1-5. Watch out:
Quartz day-of-week is 1=SUN … 7=SAT (not 0–6), and day-of-month /
day-of-week use ? — double-check if your schedule touches those fields
(Quartz cron reference).
Gotchas with every weekday schedules
- This fires at 00:00, which is the wrong end of the workday for most "weekday" jobs. People read "every weekday" as "during business hours" but
0 0 * * 1-5runs at the start of Monday, hours before anyone is online. If you want end-of-day output, you want0 17 * * 1-5instead. - Day-of-week is evaluated in the server's timezone, not the team's. A box on UTC fires this at Sunday 4pm / Monday 7am for a US-Pacific team — so your "Monday" job already ran while it was still Sunday locally, and Friday's may slip into Saturday. Pin the cron's
TZ=or convert the hour before you trust the weekday boundary. - It does not know about public holidays. Christmas, Thanksgiving, and bank holidays are still Mon–Fri to cron, so a "business-day-only" report will happily run and email an empty or misleading dataset. Gate the command with a holiday-calendar check (e.g. exit early if
date +%Fis in a holiday file).
Will you know if this job silently fails?
Cron jobs fail quietly — a server reboots, a path changes, or an error code is ignored — and nobody notices until the data is missing. A cron monitor (a dead-man’s-switch) alerts you when a scheduled job does not check in on time.
Monitor your cron jobs with UptimeRobot →
Disclosure: this is an affiliate link — we may earn a commission if you sign up, at no extra cost to you.
Is 0 0 * * 1-5 the right schedule?
If your job is really about end-of-business actions, skip midnight and use every weekday at 5pm. If you don't actually care about skipping weekends, every day at midnight is simpler and you lose nothing.
Or use the interactive cron generator & explainer, read the complete cron syntax guide, or pick another common schedule: