Cron expression for every hour
Every hour, on the hour.
Five fields for Linux, GitHub Actions and Kubernetes (minute hour day month weekday). Six or seven for Quartz. Nothing you type leaves your device.
What it means and when to use it
A single 0 in the minute field and stars everywhere else means "at minute zero of every hour": 24 runs a day, at 00:00, 01:00, 02:00 and so on. The shortcut @hourly means exactly the same thing on cron programs that support shortcuts, and the cron manual lists it as 0 * * * *. Typical jobs are hourly backups of a small database, rolling up statistics, or fetching a news feed.
Watch out for this
Two mistakes are very common. The first is writing * 0 * * *, which looks similar and is a different schedule: it runs every minute during the one hour that starts at midnight, 60 runs in a row. The minute field comes first. The second is the crowd at the top of the hour: GitHub says the start of every hour is a high-load time for scheduled workflows and recommends picking another minute, for example 17 * * * *. The same idea helps on a shared server.
What each field says
| Field | Written | Means |
|---|---|---|
| Minute | 0 | 0 |
| Hour | * | every hour |
| Day of month | * | every day of the month |
| Month | * | every month |
| Day of week | * | every day of the week |
An example of the next runs
If it were Friday 13 November 2026 at 10:20 UTC, the next six runs would be these. Times are shown in UTC and in India time (UTC+5:30).
| UTC | India time |
|---|---|
| Fri 13 Nov, 11:00 | Fri 13 Nov, 16:30 |
| Fri 13 Nov, 12:00 | Fri 13 Nov, 17:30 |
| Fri 13 Nov, 13:00 | Fri 13 Nov, 18:30 |
| Fri 13 Nov, 14:00 | Fri 13 Nov, 19:30 |
| Fri 13 Nov, 15:00 | Fri 13 Nov, 20:30 |
| Fri 13 Nov, 16:00 | Fri 13 Nov, 21:30 |
The same schedule in other places
Quartz
Quartz has a seconds field in front, uses ? in one day field, and counts Sunday as 1:
0 0 * * * ?GitHub Actions
Scheduled workflows run in UTC unless you add a time zone. In the workflow file:
on:
schedule:
- cron: '0 * * * *'Kubernetes CronJob
In a CronJob manifest the schedule goes in spec.schedule. Without spec.timeZone, it is read in the time zone of the cluster's controller:
spec:
schedule: "0 * * * *"
timeZone: "Etc/UTC"A crontab line to copy
The command is made up. Replace it with your own and use full paths:
0 * * * * /home/me/bin/hourly-backup.sh >> /home/me/backup.log 2>&1Questions
What is the difference between 0 * * * * and * 0 * * *?
The first runs once an hour at minute 0. The second runs every minute between 00:00 and 00:59, because the minute field is the first one.
This is an independent guide and tool. It is not connected with crontab.guru, Quartz, GitHub, Kubernetes, Spring or the Linux projects named here. Product names belong to their owners.