cronuru
Pattern

Every 4 Hours

0 */4 * * *
0 0 */4 * * ?
0 */4 * * *
0 */4 * * ? *
0 0 */4 * * *
0 */4 * * *

Runs every 4 hours at the top of the hour — 00:00, 04:00, 08:00, 12:00, 16:00, 20:00. 6 invocations per day.

Use in your stack

# Run every 4 hours
0 */4 * * * /usr/local/bin/sync-job.sh
{ "cron": "0 0 */4 * * ?", "timezone": "UTC" }
apiVersion: batch/v1
kind: CronJob
metadata:
  name: four-hourly
spec:
  schedule: "0 */4 * * *"
  timeZone: "UTC"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: job
            image: my-image:latest
          restartPolicy: OnFailure
cron(0 */4 * * ? *)
@Scheduled(cron = "0 0 */4 * * *", zone = "UTC")
public void every4Hours() { /* ... */ }
on:
  schedule:
    - cron: '0 */4 * * *'

Next runs

Pick a timezone to see when this expression fires next.

Next 10 runs
  1. 012026-07-13T20:00:00.000Z
  2. 022026-07-14T00:00:00.000Z
  3. 032026-07-14T04:00:00.000Z
  4. 042026-07-14T08:00:00.000Z
  5. 052026-07-14T12:00:00.000Z
  6. 062026-07-14T16:00:00.000Z
  7. 072026-07-14T20:00:00.000Z
  8. 082026-07-15T00:00:00.000Z
  9. 092026-07-15T04:00:00.000Z
  10. 102026-07-15T08:00:00.000Z

Variations

0 */3 * * *

Every 3 hours

0 */6 * * *

Every 6 hours

0 */8 * * *

Every 8 hours

0 */12 * * *

Every 12 hours

Common use cases

  • Mid-frequency data syncs between systems that drift slowly.
  • Refreshing OAuth tokens or signed URLs with a multi-hour lifetime.
  • Batch report generation six times a day.
  • Partial cache warming or incremental reindexing.

Gotchas

  • `*/4` on the hour field fires at 0, 4, 8, 12, 16, 20 — it does **not** continue to 24. The hour field is 0–23, so it wraps to the next day's 00:00, giving an even 4-hour spacing.
  • AWS EventBridge: `0 */4 * * ? *`. Quartz: `0 0 */4 * * ?` (seconds field first).
  • Aligns to UTC midnight by default — on a non-UTC server the wall-clock times shift. Pin the timezone explicitly if alignment matters.

0 */4 * * * is the six-times-a-day cadence — evenly spaced 4-hour intervals at 00:00, 04:00, 08:00, 12:00, 16:00, and 20:00. It sits between every 3 hours (8×/day) and every 6 hours (4×/day), and it’s a common default for work that must stay reasonably fresh without the load of hourly runs.

The step syntax */4 expands to the list 0,4,8,12,16,20. Because the hour field only counts 0–23, the sequence wraps cleanly at the day boundary, so the 20:00 run is followed by the next day’s 00:00 — still a 4-hour gap. If you need the runs offset from midnight, switch to an explicit list like 0 2,6,10,14,18,22 * * *. For sub-hour cadences see every 30 minutes; for less frequent, every 8 hours or every 12 hours.

Frequently asked questions

What does `0 */4 * * *` mean?
Minute `0` and hour `*/4` mean "at minute 0 of every 4th hour starting from 0." The job fires at 00:00, 04:00, 08:00, 12:00, 16:00, and 20:00 — 6 invocations per day, evenly spaced 4 hours apart.
Is `0 */4 * * *` the same as `0 0,4,8,12,16,20 * * *`?
Yes — functionally identical. `*/4` in the hour field is shorthand for the list `0,4,8,12,16,20`. Every major cron dialect accepts both forms; the step form is just shorter.
Why does every 4 hours give 6 runs, not 5 or 7?
There are 24 hours in a day and 24 ÷ 4 = 6. The runs land at 0, 4, 8, 12, 16, and 20; the next step (24) is the following day's 00:00, so the spacing stays exactly 4 hours across the day boundary.
How do I run every 4 hours starting at 02:00 instead of midnight?
Use an explicit list or an offset range: `0 2,6,10,14,18,22 * * *`, or equivalently `0 2-23/4 * * *`. Both fire every 4 hours but shifted 2 hours off midnight (02:00, 06:00, 10:00, 14:00, 18:00, 22:00).

Browse all cron patterns

Every schedule Cronuru documents, with its expression and code snippets for six dialects.