Cron Every Hour
Every hour, on the hour, is 0 * * * *: minute 0 of every hour. @hourly is the same thing where macros are allowed.
minute · hour · day · month · weekday
Build it with controlsHourly at :00
In plain English
Every hour, on the hour.
Tap a field to see what it means.
- Next run
- —
- Usually every
- —
- Time zone
- Yours
Convert to another schedulerQuartz, Spring, AWS, GitHub Actions, Kubernetes
| Standard cron | 0 * * * * | current |
|---|---|---|
| Quartz | 0 0 * * * ? | |
| Spring | 0 0 * * * * | |
| AWS EventBridge | cron(0 * * * ? *) | |
| GitHub Actions | 0 * * * * | |
| Kubernetes | 0 * * * * |
About Standard cronTime zone, day numbering, daylight saving
- Runs in the machine’s local time zone; cronie also reads CRON_TZ at the top of the crontab.
- Five fields, then the command. Day of week is 0–7 (0 and 7 are Sunday) or SUN–SAT; months 1–12 or JAN–DEC.
- When both day fields are set, a day that matches either one runs.
- Daylight saving: a job at a fixed time in a skipped hour runs right after the change, and one in a repeated hour runs once. Jobs with * in the minute or hour follow the clock.
Sources: crontab(5), cronie, cron(8), cronie, POSIX crontab.
How this works: Method, 10 sources, Checked against 1 worked example,
How this works
Method
The expression is read field by field with the rules of the scheduler you pick (ranges, lists, steps, names, @ macros, and L, W and # where it has them) into the values each field allows. The next runs come from stepping forward through the calendar in the chosen time zone, day by day and then time by time, using that scheduler’s rule for when both day fields are set and its documented rule for daylight saving (where it has none, a skipped time is skipped and a repeated one runs once). A conversion to another scheduler is parsed back and checked against the original before it is shown.
Sources
How it’s tested
One worked example for this page is checked by automated tests before every release: given the inputs, the tool must show the expected answer.
Changes
- First version: plain English and the next runs for six schedulers, a builder, conversion between them, and 20 pages for common schedules.
Worked example: 0 * * * *
Say the clock reads Monday 4 January 2027, 10:07 AM UTC. 0 * * * * means “every hour, on the hour”, so the next five runs are Monday 4 January 2027, 11:00 AM, 12:00 PM, 1:00 PM, 2:00 PM and 3:00 PM.
In UTC, where no clock change interrupts it, that comes to 24 runs a day, 168 a week and 8,760 in 2027.
Minute 0 of every hour
An hourly job needs one fixed minute and a star in the hour: 0 * * * * runs at 1:00, 2:00, 3:00 and so on, 24 times a day. The 0 is what makes it hourly; a star there would run it every minute.
@hourly is a shortcut for exactly 0 * * * * in Linux cron, Kubernetes and Spring (where it means 0 0 * * * *). GitHub Actions, Quartz and AWS don’t accept macros, so write the fields there.
Any minute works: 17 * * * * runs hourly at 17 past. Choosing a minute other than 0 is good manners on shared machines and on GitHub, where the top of the hour is the busiest time.
Pitfalls
- * */1 * * * is not hourly: the star in the minute field makes it run every minute of every hour.
- Daylight saving: in a local time zone, the hour skipped in spring loses one run, and the repeated hour in autumn gives an extra one (cron runs a * hour job in both).
- Hourly jobs that take more than an hour stack up; use a lock or a concurrency policy.
- @hourly runs once an hour, i.e. “0 * * * *”. Source: crontab(5), cronie.
- Kubernetes lists @hourly as “Run once an hour at the beginning of the hour”, equivalent to 0 * * * *. Source: Kubernetes: CronJob.
“Every Hour” in every scheduler
The same schedule written for each scheduler, converted and checked by this tool. A dash means that scheduler can’t express it in one expression; the note says why.
| Scheduler | Expression | Note |
|---|---|---|
| Standard Unix cron (Vixie cron, cronie) | 0 * * * * | |
| Quartz Scheduler (Java) | 0 0 * * * ? | |
| Spring Framework @Scheduled | 0 0 * * * * | |
| Amazon EventBridge cron() | cron(0 * * * ? *) | |
| GitHub Actions schedule | 0 * * * * | |
| Kubernetes CronJob | 0 * * * * |
Frequently Asked Questions
What is the difference between 0 * * * * and * * * * *?
0 * * * * runs once an hour, at minute 0. * * * * * runs every minute. The minute field is what decides.
Can I use @hourly everywhere?
In Linux cron (Vixie cron and cronie), Kubernetes and Spring, yes. GitHub Actions, Quartz and AWS EventBridge don’t accept @ macros, so write 0 * * * * (or the six-field form) there.
How do I run every hour from 9 to 5 on weekdays?
0 9-17 * * 1-5 runs at 9:00, 10:00 … 17:00, Monday to Friday: nine runs a day.