cronuru
Pattern

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
  1. 012026-07-03T17:00:00.000Z
  2. 022026-07-03T18:00:00.000Z
  3. 032026-07-03T19:00:00.000Z
  4. 042026-07-03T20:00:00.000Z
  5. 052026-07-03T21:00:00.000Z
  6. 062026-07-03T22:00:00.000Z
  7. 072026-07-03T23:00:00.000Z
  8. 082026-07-04T00:00:00.000Z
  9. 092026-07-04T01:00:00.000Z
  10. 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.