Cron Every Hour

To run cron every hour, use 0 * * * *. Pick the minute or an interval of 2, 4, 6 or 12 hours below, and check the next runs before you ship it.

Last updated: October 8, 2026

The short answer

To run cron every hour, use 0 * * * *. The 0 fixes the minute, and the * in the hour field lets every hour match. Without that 0, the job would run every minute.

0 * * * *
Minute0
Hour*
Day of month*
Month*
Day of week*

Runs every hour, on the hour.

Pick the hours and the minute

Choose how many hours apart, and at which minute, then the platform for the matching syntax.

Cron every hour: 0 * * * *

The minute field decides when inside the hour. 0 * * * * is on the hour, 30 * * * * is at half past. The hour field is *, so every one of the 24 hours is eligible, which gives 24 runs a day.

Most hosts are busiest at minute 0. If the job does not need to be on the hour, pick another minute. For the other end of the scale, see cron every 5 minutes.

Every 2, 3, 4, 6, 8 and 12 hours

A step in the hour field spaces runs out through the day. Keep the minute fixed at 0, or you will get an every-minute job (see the mistake below).

ExpressionWhat it doesUse
0 */2 * * *Runs every 2 hours.
Hours 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22.
Open
0 */3 * * *Runs every 3 hours.
Hours 0, 3, 6, 9, 12, 15, 18, 21.
Open
0 */4 * * *Runs every 4 hours.
Hours 0, 4, 8, 12, 16, 20.
Open
0 */6 * * *Runs every 6 hours.
Hours 0, 6, 12, 18.
Open
0 */8 * * *Runs every 8 hours.
Hours 0, 8, 16.
Open
0 0,12 * * *Runs at 12:00 AM and 12:00 PM every day.
Hours 0, 12.
Open

Hourly only during certain hours

A range limits the hours. The hyphen is inclusive, so 9-17 includes the 17:00 run.

ExpressionWhat it doesUse
0 9-17 * * *Runs every hour from 9:00 AM to 5:00 PM.
Every hour in the working day.
Open
0 9-17 * * 1-5Runs every hour from 9:00 AM to 5:00 PM every weekday (Mon-Fri).
Working hours, weekdays only.
Open
30 8-18/2 * * *Runs at 8:30 AM, 10:30 AM, 12:30 PM, 2:30 PM, 4:30 PM and 6:30 PM every day.
Every second hour, at half past.
Open

The hourly mistake that runs every minute

The classic error is putting the step in the hour field but leaving the minute as *. * */2 * * * looks like "every two hours", but it means: Runs every minute during 12 AM, 2 AM, 4 AM, 6 AM, 8 AM, 10 AM, 12 PM, 2 PM, 4 PM, 6 PM, 8 PM and 10 PM hours. That is up to 720 runs a day. The fix is a fixed minute: 0 */2 * * * means Runs every 2 hours.

A related trap is */60 * * * *: a step as large as the whole minute range matches only minute 0, so it works, but 0 * * * * says the same thing more clearly.

Hour steps that do not divide 24

As with minutes, the step restarts every day. 0 */5 * * * runs at hours 0, 5, 10, 15 and 20, and then at 0 again, so one gap is 4 hours instead of 5. CronWave reports it: Every 5 hours does not divide a day evenly. The pattern restarts at midnight, so one gap each day is shorter. For an exact interval that does not divide 24, use a rate expression where the platform has one, or a daily job that checks the elapsed time.

Daylight saving time and hourly jobs

On a UTC platform (GitHub Actions by default, Vercel, EventBridge rules) an hourly job is unaffected by clock changes. On a server in a local time zone that changes its clocks, the hour that does not exist is skipped in spring and the repeated hour in autumn may run once or twice, depending on the cron implementation. If a job must run exactly 24 times a day, run the scheduler in UTC. See the cron timezone converter.

Every hour on each platform

PlatformExpressionNote
Linux / Unix0 * * * *@hourly also works. Linux guide
Kubernetes0 * * * *@hourly is the same schedule. Kubernetes guide
GitHub Actions0 * * * *The start of the hour is the busiest time on GitHub. Use an odd minute. GitHub Actions guide
Vercel0 * * * *Needs the Pro plan: Hobby allows one run per day. Vercel guide
AWS EventBridgecron(0 * * * ? *)rate(1 hour) is the simple form. AWS guide
Quartz0 0 * * * ?Seconds, minutes, hours: 0 0 * * * ?. Quartz guide

Sources and further reading