Cron every 30 minutes during business hours: the expression, explained, in Python
The cron expression for “every 30 minutes during business hours” is */30 9-17 * * 1-5. This page shows what each field does, the next five times it will fire, the mistake most people make with it, and a working Python example you can paste.
The expression
| Field | Value | Meaning |
|---|---|---|
| minute | */30 | every 30 minutes, starting at 0 |
| hour | 9-17 | from 9 to 17 |
| day of month | * | every day of month |
| month | * | every month |
| day of week | 1-5 | Monday to Friday |
Next five runs (UTC, from now)
- 2026-09-18 09:00 UTC
- 2026-09-18 09:30 UTC
- 2026-09-18 10:00 UTC
- 2026-09-18 10:30 UTC
- 2026-09-18 11:00 UTC
Mistakes people make with this schedule
- "9-17" includes the whole of hour 17, so the last run of the day is at 17:45, not 17:00, and the first is at 09:00. Use "9-16" if 17:00 must be the last.
- Assuming the server clock is your clock. Cron runs in the machine’s timezone unless the runtime says otherwise; the examples here are UTC.
- No lock around a job that might overlap itself, and no alert when it silently stops. That second one is what Supercrontab is for.
Run it in your stack
from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.triggers.cron import CronTrigger
sched = BlockingScheduler(timezone="UTC")
sched.add_job(run_report, CronTrigger.from_crontab("*/30 9-17 * * 1-5"))
sched.start()APScheduler accepts the crontab string directly. Celery beat needs the crontab() helper instead.
Questions
Does */30 9-17 * * 1-5 run in my local time?
Only if the scheduler is configured for it. crontab uses the system timezone; Vercel and GitHub Actions always use UTC; Laravel and node-cron take a timezone option. In Supercrontab the timezone is a field on the job.
What if the previous run is still going?
Classic cron starts the next run anyway. Add a lock (flock on Linux, withoutOverlapping() in Laravel) or let Supercrontab skip the tick while the previous request is open.
Is there a shorter way to write this?
No. The five-field form is the shortest portable version.