Cron every hour during business hours

The cron expression for every hour during business hours is:

0 9-17 * * 1-5

Runs on the hour from 09:00 to 17:00, Monday to Friday: 9 runs a day, 45 a week.

45 times a week
Standard 5-field cron

Next 10 runs

For 0 9-17 * * 1-5, in the timezone you pick. Cron uses the server's timezone.

Times in UTC as of the last site update. They refresh when the page loads in a browser.

#Date and timeWhen
1Oct 30, 2026, 09:00Friday
2Oct 30, 2026, 10:00Friday
3Oct 30, 2026, 11:00Friday
4Oct 30, 2026, 12:00Friday
5Oct 30, 2026, 13:00Friday
6Oct 30, 2026, 14:00Friday
7Oct 30, 2026, 15:00Friday
8Oct 30, 2026, 16:00Friday
9Oct 30, 2026, 17:00Friday
10Nov 2, 2026, 09:00Monday

How to read 0 9-17 * * 1-5

0 pins the job to minute 0. 9-17 in the hour field is every hour from 9 to 17, both included. 1-5 in the day-of-week field is Monday to Friday.

FieldValueMeaningAllowed
Minute0At the top of the hour0-59
Hour9-17Every hour from 9:00 AM to 5:00 PM0-23
Day of month*Every day of the month1-31
Month*Every month1-12 or jan-dec
Weekday1-5Monday through Friday0-7 or sun-sat

Watch out for

  • Ranges include both ends, so the last run is at 17:00. Use 9-16 to stop at 16:00.
  • For every 30 minutes in the same window, use */30 9-17 * * 1-5 (the last run is then 17:30).

Often used for: Syncs and checks that only matter while people are working.

Use it in

crontab

0 9-17 * * 1-5 /path/to/your-script.sh

Edit with crontab -e. Runs in the server's timezone.

Kubernetes CronJob

apiVersion: batch/v1
kind: CronJob
metadata:
  name: my-job
spec:
  schedule: "0 9-17 * * 1-5"
  timeZone: "Etc/UTC"
  jobTemplate:
    spec:
      template:
        spec:
          restartPolicy: OnFailure
          containers:
            - name: my-job
              image: busybox:1.36
              command: ["sh", "-c", "date"]

Without timeZone, the schedule follows the timezone of the kube-controller-manager.

GitHub Actions

on:
  schedule:
    - cron: '0 9-17 * * 1-5'
      timezone: "Etc/UTC"
jobs:
  run:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: ./your-script.sh

Without timezone, GitHub runs schedules in UTC. It runs them at most every 5 minutes, and a run can start late when GitHub is busy.

All cron schedules

Cron does not tell you when a job stops

Know when a job on this schedule does not run.

Your job pings Drumbeats when it finishes. If a ping does not arrive on schedule, you get an alert. No SDK, free for up to 50 monitors.

Free for up to 50 monitors · Setup in 60 seconds · No credit card required