Skip to main content

Cron every hour explained

0 * * * *

Every hour, every day.

Next runs · UTC

Calendar

September 2026 · UTC

0 runs

About this tool

The cron expression for every hour is 0 * * * *. The minute field is 0 (top of the hour), the hour is * (every hour), and the remaining fields are wildcards. The job fires 24 times per day, once per hour at minute 00.
It's the canonical “hourly job” cadence - useful for cleanup tasks, hourly snapshots, log rotation, daily-aggregation prep, billing meter reads, and any work that doesn't need sub-hour precision.

Why 0 * * * * and not * * * * *?

The minute field is what determines the cadence here. Wildcarding the minute (* * * * *) gives you every minute - 60 firings per hour. Pinning the minute to 0 gives you exactly one firing per hour, at xx:00.

The hour wildcard * says “every hour”. Combined with minute 0, the full schedule is “every hour, at minute 0”.

Every hour on different platforms

Linux crontab

crontab
0 * * * * /path/to/script.sh
# Or with the @hourly alias:
@hourly /path/to/script.sh

Vercel cron jobs

json
{
  "crons": [
    { "path": "/api/cron/hourly", "schedule": "0 * * * *" }
  ]
}

AWS EventBridge

crontab
cron(0 * * * ? *)
# or:
rate(1 hour)

Quartz (Java)

java
Trigger trigger = newTrigger()
    .withSchedule(cronSchedule("0 0 * * * ?"))
    .build();

Kubernetes CronJob

yaml
spec:
  schedule: "0 * * * *"
  concurrencyPolicy: Forbid

Variations on every hour

  • 30 * * * * - every hour at xx:30.
  • 0,30 * * * * - every half hour (twice an hour).
  • 0 */2 * * * - every 2 hours at the top of the hour.
  • 0 9-17 * * 1-5 - hourly during business hours on weekdays.
  • 0 0,12 * * * - at midnight and noon every day (twice daily).
  • */15 * * * * - every 15 minutes (4x as frequent).
  • 0 0 * * * - every day at midnight (24x less frequent).

Hourly cron pitfalls

  • Daylight saving - at the spring-forward hour (typically 02:00 → 03:00), the 02:00 firing is skipped. At the fall-back hour, the 02:00 firing happens twice. Pin to UTC if your job must fire exactly 24 times a day.
  • Top-of-the-hour load spike - every hourly cron in your crontab fires at the same instant. Spread them out: some at 0, some at 15, some at 30, etc. Or use the Jenkins H modifier for deterministic hashing.
  • Long-running hourly jobs - if the work takes more than 60 minutes, you need a lock or a concurrency-aware scheduler. Otherwise the next firing starts before the previous finishes.

Examples

  • 0 18 * * *
    Every day at 18:00
  • 0 */5 * * *
    Every 5 hours
  • 0 18 * * 1-5
    Weekdays at 18:00
  • 0 0 1 * *
    Once a month, on the 1st at midnight

Cheatsheet

Full cheatsheet
FieldReq.RangeWildcards
minuteyes0-59, - * /
houryes0-23, - * /
day of monthyes1-31, - * /
monthyes1-12 or JAN-DEC, - * /
day of weekyes0-6 or names; some dialects use 0-7 or 1-7 — see Dialects, - * /

Frequently asked questions

Syntax

What is the cron expression for every hour?

0 * * * *. The minute field is 0 (top of the hour), the hour field is * (every hour), and the rest are wildcards. The job fires once an hour at minute 00 - 24 times per day. Expression: 0 * * * *

Open in editor
Is 0 * * * * the same as */60 * * * *?

Almost. Both fire once per hour at minute 0. But */60 is technically invalid in some parsers because the step value can't equal the field's range size. Stick with 0 * * * * for portability.

Timing

How do I run every hour but not at the top of the hour?

Pick the minute you want and pin it: 30 * * * * fires at every xx:30. 15 * * * * fires at xx:15. The minute field accepts a single literal. To fire every hour at multiple minutes (xx:00 and xx:30), use a list: 0,30 * * * *. Expression: 30 * * * *

Open in editor
How do I run every 2 hours, every 3 hours, etc?

Step in the hour field: 0 */2 * * * for every 2 hours, 0 */3 * * * for every 3, 0 */6 * * * for every 6. The minute pins it to the top of the hour. Expression: 0 */2 * * *

Open in editor
How do I run every hour during business hours?

0 9-17 * * 1-5 - every hour from 09:00 through 17:00 on weekdays. Nine runs per weekday. For tighter cadence within business hours use the minute field too: */15 9-17 * * 1-5 for every 15 minutes during the same window. Expression: 0 9-17 * * 1-5

Open in editor
Is hourly cron the same as every 60 elapsed minutes?

No. 0 * * * * targets each wall-clock hour at minute zero. A fixed 60-minute interval normally starts from creation or completion time and need not align to the clock.

How many times does hourly cron run per day?

It normally runs 24 times per day. A DST-observing local day can contain 23 or 25 hourly wall-clock slots.

Timezones and DST

How does DST affect an hourly cron?

Local spring-forward days can skip one hourly slot, and fall-back days can repeat one. UTC produces 24 aligned hourly slots per UTC day.

Platforms

What is every hour in Spring cron?

Use 0 0 * * * *. Spring's first field is seconds and its second is minutes, so both are zero for the top of every hour. Expression: 0 0 * * * *

Open in editor
What is every hour in AWS EventBridge?

Use cron(0 * * * ? *) for clock-aligned hours or rate(1 hour) for an elapsed interval anchored to rule creation.

Can Vercel run an hourly cron?

Vercel supports 0 * * * * on plans that allow sub-daily schedules. Hobby is limited to once per day, and Vercel schedules use UTC.

Debugging

Why offset an hourly cron from minute zero?

Minute zero is a common load spike because many hourly jobs start together. Choosing 7 * * * * or another offset spreads database, network, and compute demand. Expression: 7 * * * *

Open in editor
What if an hourly job takes more than an hour?

The next tick may overlap the active run. Use a lock, queue, or scheduler concurrency policy, and decide whether delayed windows should be skipped or processed later.

Will cron replay an hourly tick missed during downtime?

Traditional cron will not. If every hour's data matters, store a processing watermark and catch up missing windows after restart.

Crontap

Can Crontap run a job every hour?

Yes. You can schedule an HTTP job on Crontap with 0 * * * *, optionally offsetting the minute to avoid top-of-hour load. Expression: 0 * * * *

Open in editor

Write the cron here. Run it on Crontap.

Point Crontap at any URL. Pick any cron. Done.

WordPress, Shopify, Railway, Cloud Run, Vercel, HubSpot, Ghost, your own box. If it answers HTTP, Crontap can drive it on a clock you can read, in the timezone that actually matters, and page you when something breaks.

1.9k+ teams · Free forever tier · No credit card