Every Hour
0 * * * * 0 0 * * * ? 0 * * * * 0 * * * ? * 0 0 * * * * 0 * * * * Runs at the top of every hour — :00 of every hour, every day. 24 invocations per day.
Use in your stack
# Run every hour, on the hour
0 * * * * /usr/local/bin/hourly-report.sh
# Equivalent shortcut (Linux crontab only)
@hourly /usr/local/bin/hourly-report.sh
{ "cron": "0 0 * * * ?", "timezone": "UTC" }
apiVersion: batch/v1
kind: CronJob
metadata:
name: hourly-report
spec:
schedule: "0 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hourly-report
image: my-image:latest
restartPolicy: OnFailure
cron(0 * * * ? *)
@Scheduled(cron = "0 0 * * * *")
public void everyHour() { /* ... */ }
on:
schedule:
- cron: '0 * * * *'
Next runs
Pick a timezone to see when this expression fires next.
Next 10 runs
- 012026-07-03T17:00:00.000Z
- 022026-07-03T18:00:00.000Z
- 032026-07-03T19:00:00.000Z
- 042026-07-03T20:00:00.000Z
- 052026-07-03T21:00:00.000Z
- 062026-07-03T22:00:00.000Z
- 072026-07-03T23:00:00.000Z
- 082026-07-04T00:00:00.000Z
- 092026-07-04T01:00:00.000Z
- 102026-07-04T02:00:00.000Z
Variations
Common use cases
- Hourly summary reports or analytics rollups.
- Cache compaction or short-lived cache eviction.
- Polling external systems on the hour.
- Sending hourly notifications or alerting summaries.
Gotchas
- Don't write `* * * * *` thinking it means "every hour" — that's every minute (1440 runs/day, not 24).
- Many systems support the `@hourly` shortcut, which expands to `0 * * * *`. Kubernetes CronJob accepts it; GitHub Actions does not.
- If you need "hourly but offset by 15 minutes," use `15 * * * *` — runs at :15 of every hour.
0 * * * * is the canonical “hourly” cron expression. Most systems also accept the @hourly shortcut, which expands to the same thing. Pick whichever your team reads more easily.
Frequently asked questions
What does `0 * * * *` mean?
The `0` in the minute field means "at minute 0." The four asterisks for hour, day of month, month, and day of week mean "every value." So the job fires at minute 0 of every hour — :00 each hour, every day. 24 runs per day total.
Is `0 * * * *` the same as `@hourly`?
Yes, on systems that support the shortcut. `@hourly` is shorthand for `0 * * * *`. Linux crontab, anacron, and Kubernetes CronJob all accept `@hourly`. GitHub Actions does not — write `0 * * * *` explicitly there.
How do I run every hour but at :30 instead of :00?
Use `30 * * * *`. The first field is minute — set it to whatever offset you want. `15 * * * *` fires at :15 of every hour, `45 * * * *` at :45.
Why does my cron at `* * * * *` run every minute instead of every hour?
Because `*` in the minute field means "every minute," not "any one minute per hour." For every-hour scheduling, the minute field must be a specific value (`0` for the top of the hour). `* * * * *` runs 60 times per hour.
Browse all cron patterns
Every schedule Cronuru documents, with its expression and code snippets for six dialects.