Developer Toolbox

Cron: every hour

The minute field is fixed at 0 and every other field is open, so the job runs on the hour, 24 times a day. @hourly is a shorthand for exactly this.

Open in Cron Parser The expression is filled in: change it and watch the next runs.

Expression

0 * * * *
Meaning

At minute 0 of every hour

Next 5 runs

Your time zone

The same schedule on other platforms

PlatformWritten asNote
Linux crontab0 * * * *Five fields, in the server's local time zone. A % in the command has to be escaped as \%.
GitHub Actions- cron: '0 * * * *'Five fields, in UTC unless a timezone (an IANA name such as Europe/Warsaw) is set next to cron. Default branch only. The shortest interval is 5 minutes; when GitHub is busy, runs start late and some are dropped.
Kubernetes CronJobschedule: "0 * * * *"Five fields, in the controller's time zone unless spec.timeZone is set (Kubernetes 1.27 and later). concurrencyPolicy decides what happens when runs overlap.
systemd timerOnCalendar=hourlyIts own calendar syntax, in a .timer unit, local time. hourly, daily and monthly match cron, but weekly means Monday. Persistent=true catches up on runs missed while the machine was off.
AWS EventBridgecron(0 * * * ? *)Or rate(1 hour), which counts from when the rule was created instead of the top of the hour.
Quartz / Spring0 0 * * * ?Six fields, seconds first. Quartz needs ? in one of the day fields and counts Sunday as 1; Spring accepts ? and numbers days like cron.

Common mistakes

  • * 1 * * * is not hourly

    It runs every minute from 01:00 to 01:59: sixty runs, once a day. The minute has to be fixed for an hourly job.

  • The top of the hour is crowded

    Log rotation, backups and every other hourly job start at :00. A fixed odd minute, such as 17 * * * *, spreads the load.

  • On GitHub, :00 is the busiest minute

    Scheduled workflows queue up at the top of the hour. Another minute gets your run started sooner.