Quick answer
The cron expression for every weekday at 9am is 0 9 * * 1-5. Minute 0 and hour 9 set the time to 09:00, and 1-5 in the day-of-week field limits it to Monday through Friday, while the day-of-month and month fields stay as asterisks. It runs five times a week, at 9 AM in the time zone of whatever evaluates the schedule.
- Live next runs
- Any time zone
- Field-by-field breakdown
- Seven platform snippets
- Daylight saving aware
How to use this schedule
- 1Copy
0 9 * * 1-5with the Copy expression button. - 2Check Next runs in your time zone to confirm it fires when you expect, including around daylight saving changes.
- 3Pick your platform under Use it on your platform and copy the ready-made crontab line, workflow, manifest or timer.
- 4Need a different time or day? Click Customize to open it in the cron expression generator and change any field.
How do I run a cron job at 9am on weekdays in my time zone?
The expression is the easy part; the time zone is where this schedule usually breaks. 0 9 * * 1-5 means 09:00 in the scheduler's zone, and several popular schedulers default to UTC or only support it. For a team in New York:
| Period | New York offset | UTC expression for 9 AM local |
|---|---|---|
| Daylight saving time (March to November) | UTC−4 | 0 13 * * 1-5 |
| Standard time (November to March) | UTC−5 | 0 14 * * 1-5 |
One UTC expression can't follow the clock change, so you have three options:
- Use a scheduler with a time zone setting: GitHub Actions with
timezone: America/New_Yorknext to the cron line, a Kubernetes CronJob withtimeZone, AWS EventBridge Scheduler, systemd with a zone inOnCalendar, or cronie withCRON_TZ. - Update the UTC expression twice a year, and accept being an hour off if you forget.
- Run at both candidate UTC hours (
0 13,14 * * 1-5) and let the job exit unless the local hour in New York is 9.
Why is 9am on weekdays such a popular schedule?
It lines up with the start of the working day, so its output is fresh when people arrive: a stand-up digest in Slack, a report of yesterday's signups, a reminder about overdue invoices or a check that last night's backups finished. Because the audience is human, timing errors are noticed immediately, which is why the time zone question matters more here than for a backup nobody watches. If the job sends anything to people, make it idempotent so a manual rerun after a failure doesn't send duplicates.
What does each field in 0 9 * * 1-5 mean?
| Field | Value | Allowed | Meaning |
|---|---|---|---|
| Minute | 0 | 0–59 | at minute 0 (on the hour) |
| Hour | 9 | 0–23 | at hour 9 (9 AM) |
| Day of month | * | 1–31 | every day of the month |
| Month | * | 1–12, JAN–DEC | every month |
| Day of week | 1-5 | 0–7 (0 and 7 are Sunday), SUN–SAT | Monday through Friday |
Read together: At 09:00 on every weekday, Monday through Friday.
How do I adjust 0 9 * * 1-5 to my own schedule?
Small edits to 0 9 * * 1-5 cover most real-world needs:
| Expression | What it does |
|---|---|
0 13 * * 1-5 | 9 AM New York time during daylight saving time, written in UTC |
0 14 * * 1-5 | 9 AM New York time during standard time, written in UTC |
30 8 * * 1-5 | 8:30 AM on weekdays |
0 9 * * 1 | 9 AM on Mondays only |
0 9,17 * * 1-5 | 9 AM and 5 PM on weekdays |
Need something else? Click Customize at the top of the page to open this schedule in the cron expression generator and change any field.
Related schedules: Every weekday · Every day at 9am · Business hours (every hour) · Every Friday at 5pm
Browse all schedules in the cron schedule library.
How do I run 0 9 * * 1-5 in crontab, GitHub Actions, Kubernetes and the cloud?
| Platform | Write it as | Time zone |
|---|---|---|
| Linux crontab | 0 9 * * 1-5 | Server's time zone; CRON_TZ= in cronie |
| GitHub Actions | - cron: "0 9 * * 1-5" | UTC by default; add timezone: (IANA name) |
| Kubernetes CronJob | schedule: "0 9 * * 1-5" | Set timeZone: (1.27+) |
| Cloudflare Workers | 0 9 * * MON-FRI | UTC only; numbers weekdays from 1 = Sunday, so use names |
| Vercel Cron Jobs | 0 9 * * 1-5 | UTC only; Hobby runs it within the hour (±59 min) |
| AWS EventBridge Scheduler | cron(0 9 ? * MON-FRI *) | Takes a time zone; legacy scheduled rules are UTC only |
| systemd timer | OnCalendar=Mon..Fri *-*-* 09:00:00 | Add a zone after the time, e.g. Europe/London |
In a crontab (crontab -e), the full line looks like this:
0 9 * * 1-5 /path/to/job.sh >> /var/log/job.log 2>&1The live panel at the top of the page builds complete, copy-ready files for each platform (workflow, CronJob manifest, wrangler.toml, vercel.json, AWS CLI and systemd units) and can shift the schedule to UTC for platforms that need it.
What can go wrong with 0 9 * * 1-5?
- Cloudflare Workers and Vercel only evaluate schedules in UTC, and GitHub Actions does too unless you add
timezone:. A plain0 9 * * 1-5there runs at 09:00 UTC, which is 4 or 5 AM in New York. - Converting to UTC can move the weekday as well as the hour. 9 AM Monday in Sydney is Sunday evening in UTC, so the expression becomes
0 23 * * 0-4(or0 22 * * 0-4during Australian daylight saving time). - Public holidays are still weekdays to cron. If a digest shouldn't go out on a holiday, check a holiday calendar in the job and exit early.
- Several 09:00 jobs on one server start in the same second. Stagger them by a minute or two if they share a database or a rate-limited API.
- On UTC-only platforms (Cloudflare Workers, Vercel, legacy EventBridge rules), the local time this runs at moves by an hour when daylight saving time starts or ends. Use GitHub's
timezone:, KubernetestimeZone, EventBridge Scheduler or cronie'sCRON_TZto pin it to local time.
Frequently asked questions
Last updated by the Playxoft engineering team.