Every 15 Minutes During Business Hours Cron – Free, Online, Private
*/15 9-17 * * 1-5 runs every 15 minutes from 09:00 through 17:00, Monday to Friday. Plain English: Every 15 minutes, between 09:00 and 17:59, Monday through Friday
The next runs appear when the expression parses.
*/15 9-17 * * 1-5 /usr/local/bin/job
on:
schedule:
- cron: "*/15 9-17 * * 1-5"
apiVersion: batch/v1
kind: CronJob
metadata:
name: job
spec:
schedule: "*/15 9-17 * * 1-5"
timeZone: "Etc/UTC"
jobTemplate:
spec:
template:
spec:
restartPolicy: OnFailure
containers:
- name: job
image: busybox:1.36
args: ["echo", "job"]
The expression
*/15 9-17 * * 1-5 is a five-field cron expression: minute, hour, day of month, month, day of week. There is no seconds field and no year field. Every 15 minutes, between 09:00 and 17:59, Monday through Friday The next five run times on this page are computed in your browser with the same expression, in UTC, so a reload later in the hour shows a later list. Edit the box if you want to nudge a field and watch the list change, or open the line in the cron parser.
What each field is doing
The minute field is */15, a step of 15 across the whole 0–59 range. The matches are aligned to the start of that range. It does not mean "the value 15" and it does not start from the moment you save the file. The hour field is the inclusive range 9-17, from 9 through 17, inside the 0–23 range. Values outside the range do not match. The day-of-month field is an asterisk, so every value in the 1–31 range is allowed. This field is not what limits the schedule. The month field is an asterisk, so every value in the 1–12 range is allowed. This field is not what limits the schedule. The day-of-week field is the inclusive range 1-5, from 1 through 5, inside the 0–6, Sunday as 0 or 7 range. Values outside the range do not match.
When the day-of-month and day-of-week fields are both something other than *, many cron implementations run the job if either field matches. This preset leaves at least one of those two fields as *, so you do not have to resolve that rule to predict it. Names such as MON and JAN are readable and widely accepted. The snippets use numbers so a strict parser does not have to know the names.
Why this schedule
This is the quarter-hour schedule with the nights and weekends removed. The minute step is */15, the hours are the inclusive office range, and the weekdays are 1-5. It is what a team wants for a queue check that is pointless at 03:00 and annoying on Sunday. Outside 09:00 to 17:00 the expression does not match, so the last run of the day is 17:45.
Polling a support inbox, refreshing a business dashboard, and retrying a flaky partner API during the hours someone can answer a failure all fit. A security scan that should run when traffic is low belongs at night, on a different expression.
Where it goes wrong
Hour 17 with */15 still includes 17:00, 17:15, 17:30, and 17:45. People who stop work at 17:00 often wanted the range to end at 16. The day-of-month field is unrestricted. A public holiday still matches. GitHub Actions can schedule this, because the step is 15 minutes, but the hours are UTC hours. Convert them. The L, W, and # extensions are not part of this expression and are not required for it.
A sixth field is the seconds field used by Quartz, some Spring apps, and some Kubernetes setups that are not the classic CronJob schedule. Classic crontab, GitHub Actions, and the schedule field of a batch/v1 CronJob are five fields. If you paste a six-field line into those systems, the extra token shifts every field one place to the left and the job runs on a different day. L, W, and the # 'nth weekday' modifier are real in some daemons and rejected or reinterpreted in others. They are not used on this page. The English description and the next runs both refuse to guess at a token the calculator does not share with every target.
Crontab, GitHub Actions, and Kubernetes
GitHub Actions accepts this cadence. The schedule is UTC, it can start late when the service is busy, and it is dropped if the repository has had no activity for sixty days. The workflow file only needs the expression. It does not need a seconds field.
A user crontab does not include the username. A system crontab, the kind in /etc/crontab, inserts the user between the expression and the command. The line below is the user form. Kubernetes CronJob has used spec.timeZone since 1.27. The manifest sets it to Etc/UTC so the schedule matches the next-run list. Remove the field on a cluster older than that, and know that the schedule then uses the controller's zone.
crontab*/15 9-17 * * 1-5 /usr/local/bin/job
GitHub Actionson:
schedule:
- cron: "*/15 9-17 * * 1-5"
Kubernetes CronJobapiVersion: batch/v1
kind: CronJob
metadata:
name: every-15-minutes-business-hours
spec:
schedule: "*/15 9-17 * * 1-5"
timeZone: "Etc/UTC"
jobTemplate:
spec:
template:
spec:
containers:
- name: job
image: busybox:1.36
args: ["echo", "every-15-minutes-business-hours"]
restartPolicy: OnFailure
- Keep the command idempotent. Cron does not remember a failure and it does not skip a run that is already in progress.
- Write the timezone next to the expression. UTC in the file and local time in the ticket are how a job fires eight hours early.
- Offset the minute if several jobs would otherwise start at once.
Frequently asked questions
What does */15 9-17 * * 1-5 mean?
Every 15 Minutes During Business Hours Cron is the five-field expression */15 9-17 * * 1-5. Every 15 minutes, between 09:00 and 17:59, Monday through Friday
Does */15 9-17 * * 1-5 include a seconds field?
No. Every 15 Minutes During Business Hours Cron (*/15 9-17 * * 1-5) is minute, hour, day of month, month, and day of week. Add a seconds field only if the scheduler you are configuring documents six fields, and do not paste that six-field line into a five-field crontab.
Which timezone are the next runs of */15 9-17 * * 1-5 shown in?
UTC. The next five times for Every 15 Minutes During Business Hours Cron are computed from */15 9-17 * * 1-5 in UTC. GitHub Actions schedules are UTC. A server crontab uses the server's zone unless you set one. The Kubernetes snippet on this page sets timeZone to Etc/UTC.
Can I edit */15 9-17 * * 1-5 on this page?
Yes. The box starts as */15 9-17 * * 1-5, the Every 15 Minutes During Business Hours Cron preset, and recomputes the English sentence and the next five UTC runs as you type. The cron parser and the cron builder open the same kind of five-field expression.