★ Cron cheat sheet
Cron Expression: Every Hour During Business Hours
On the hour from 09:00 to 17:00, Monday to Friday: nine runs a day.
- Runs in your browser
- No signup
The expression
0 9-17 * * 1-5
At minute 0 past every hour from 9 through 17 on Monday through Friday.
- 0Minute
- 9-17Hour
- *Day of month
- *Month
- 1-5Day of week
✓ Valid 5-field cron
Quick picks
Typing by hand. Pick a pattern above to build one with inputs instead.
In plain English
At minute 0 past every hour from 9 through 17 on Monday through Friday.
Next 10 runs
Paste it into your platform
Time zone: UTC
0 9-17 * * 1-5 /usr/local/bin/my-job >> /var/log/my-job.log 2>&1
- OKRuns in the server’s local time zone. cronie (RHEL, Fedora) accepts a CRON_TZ= line above the job; Debian’s cron does not.
- Heads-upEscape % as \% in the command: an unescaped % ends the command and starts stdin.
- Heads-upcron runs with a minimal PATH and no login shell. Use absolute paths and redirect output, or failures disappear.
- Linux crontab docs ↗
Cron jobs failing silently?
I build background job systems with retries, alerting and dashboards, so you hear about failures before your customers do.
What 0 9-17 * * 1-5 means
Field by field:
| Field | Value | Matches |
|---|---|---|
| Minute | 0 | 0 |
| Hour | 9-17 | 9, 10, 11, 12, 13, 14 … 17 (9 values) |
| Day of month | * | any |
| Month | * | any |
| Day of week | 1-5 | Monday, Tuesday, Wednesday, Thursday, Friday |
Gotchas
- 9-17 includes 17, so the last run is 17:00. Use 9-16 if the day should end before 5pm.
- Business hours are local. On UTC schedulers, both the hours and the weekday edges shift for most of the world.
Does it run everywhere?
Checked against each platform's rules, assuming UTC:
| Platform | Verdict | Why |
|---|---|---|
| Linux crontab | Works, with a catch | Escape % as \% in the command: an unescaped % ends the command and starts stdin. |
| GitHub Actions | Works, with a catch | Runs at minute 0 are the most likely to be delayed or dropped under load. GitHub suggests another minute, e.g. 17. |
| Vercel | Not supported | Hobby plan: deploy fails, because Hobby cron jobs may run at most once per day. Pro and Enterprise allow once per minute. |
| AWS EventBridge | Works | Six fields: the year is added at the end, and one of day-of-month / day-of-week must be ?. |
| Kubernetes | Works, with a catch | Without timeZone, the schedule uses the kube-controller-manager’s local zone. TZ= or CRON_TZ= inside schedule is rejected from v1.29. |
Questions engineers actually ask
What is the cron for hourly during business hours?
How do I include Saturday?
Why does my job run on days I didn't expect?
What time zone does cron use?
Other schedules
- Every Minute
* * * * * - Every 2 Minutes
*/2 * * * * - Every 5 Minutes
*/5 * * * * - Every 10 Minutes
*/10 * * * * - Every 15 Minutes
*/15 * * * * - Every 30 Minutes
*/30 * * * * - Every Hour
0 * * * * - Every 2 Hours
0 */2 * * * - Every 3 Hours
0 */3 * * * - Every 6 Hours
0 */6 * * * - Every 12 Hours
0 */12 * * * - Twice a Day
0 9,21 * * * - Every Day at Midnight
0 0 * * * - Every Day at 9am
0 9 * * * - Every Day at Noon
0 12 * * * - Every Weekday
0 0 * * 1-5 - Every Weekday at 9am
0 9 * * 1-5 - Every Weekend
0 0 * * 6,0 - Every Monday
0 0 * * 1 - Every Friday at 5pm
0 17 * * 5 - Every Sunday at Midnight
0 0 * * 0 - Every Week
0 0 * * 0 - Every 15th of the Month
0 0 15 * * - First Day of the Month
0 0 1 * * - Last Day of the Month
0 0 28-31 * * - Every Month
0 0 1 * * - Every Quarter
0 0 1 1,4,7,10 * - Every Year
0 0 1 1 * - Every 30 Minutes During Business Hours
*/30 9-17 * * 1-5
Or build your own in the cron expression builder.
More from the workbench
Fine print
Tools: on the house.
Engineer: by the hour.
Infra that doesn't page you at 3am costs a little more. I build background job systems with retries, alerting and dashboards.
I'm Himanshu, an AI and full-stack engineer. I build MVPs, AI agents and the growth plumbing around them for early-stage startups.
