DEVESSENTIALS

0 */6 * * * — What does this cron expression mean?

0 */6 * * * splits the day into four equal blocks. Both fields matter: the leading 0 pins the run to minute 0, and */6 in the hour field picks hours 0, 6, 12 and 18. Leave the minute as * by accident and the job runs every minute of those four hours, 240 times a day instead of 4.

In plain English

0 */6 * * *

Run the job every 6 hours, on the hour: at 00:00, 06:00, 12:00 and 18:00 every day.

Frequency: 4 runs per day. cronstrue reads it as “On the hour, every 6 hours”.

Open 0 */6 * * * in the Cron Builder

Field-by-field breakdown

0

Minute

0–59

*/6

Hour

0–23

*

Day of month

1–31

*

Month

1–12

*

Day of week

0–6

  • Minute0 — only at minute 0. This is what makes it “every 6 hours” rather than “every minute during every 6th hour”.
  • Hour*/6 — every 6th hour starting at 0: 0, 6, 12, 18.
  • Day of month* — every day of the month.
  • Month* — every month.
  • Day of week* — every day of the week.

Next run times

Example: next 5 runs

Example: if it is Monday, 5 Jan 2026, 09:07 UTC, the next runs of 0 */6 * * * (UTC) are:

  1. #1Mon, 5 Jan 2026, 12:00 UTC
  2. #2Mon, 5 Jan 2026, 18:00 UTC
  3. #3Tue, 6 Jan 2026, 00:00 UTC
  4. #4Tue, 6 Jan 2026, 06:00 UTC
  5. #5Tue, 6 Jan 2026, 12:00 UTC

Live times from your current clock replace this example once the page loads. Cron uses the scheduler's timezone; most cloud servers, GitHub Actions and AWS EventBridge rules use UTC.

0 */6 * * * in Quartz, AWS, GitHub Actions, Kubernetes and systemd

Crontab (Linux / macOS)

0 */6 * * * /usr/local/bin/job.sh >> /var/log/job.log 2>&1

Standard 5-field syntax used by Vixie cron, cronie, busybox crond and most libraries (node-cron, APScheduler, robfig/cron).

Quartz (6 and 7 fields)

0 0 0/6 * * ?
0 0 0/6 * * ? *

# Spring @Scheduled
@Scheduled(cron = "0 0 */6 * * *")

Quartz fields are seconds, minutes, hours: 0 0 0/6 means second 0, minute 0, every 6th hour from midnight.

AWS EventBridge

cron(0 0/6 * * ? *)

# interval alternative
rate(6 hours)

cron(0 0/6 …) runs at 00, 06, 12 and 18 UTC. rate(6 hours) runs 6 hours apart starting from creation time, so the hours depend on when you deployed.

GitHub Actions

on:
  schedule:
    # Every 6 hours, evaluated in UTC
    - cron: '0 */6 * * *'

Runs at 00:00, 06:00, 12:00 and 18:00 UTC. Because all four are top-of-the-hour, they are prime candidates for GitHub's scheduling delays; 17 */6 * * * is usually more punctual.

Kubernetes CronJob

apiVersion: batch/v1
kind: CronJob
metadata:
  name: every-6-hours
spec:
  schedule: "0 */6 * * *"
  timeZone: "Etc/UTC"
  concurrencyPolicy: Forbid
  startingDeadlineSeconds: 1800
  jobTemplate:
    spec:
      template:
        spec:
          restartPolicy: OnFailure
          containers:
            - name: job
              image: alpine:3.20
              command: ["/bin/sh", "-c", "echo running"]

With only four runs a day, a 30-minute deadline gives a generous retry window if the cluster was busy at the scheduled time.

systemd timer

# /etc/systemd/system/myjob.timer
[Unit]
Description=Every 6 hours

[Timer]
OnCalendar=*-*-* 00/6:00:00
Persistent=true

[Install]
WantedBy=timers.target

Equivalent explicit form: *-*-* 00,06,12,18:00:00.

When to use every 6 hours

  • Refreshing OAuth tokens or API keys with a 12- or 24-hour lifetime.
  • Incremental backups between a nightly full backup.
  • Regenerating sitemaps or product feeds for marketplaces that re-crawl a few times a day.
  • Checking TLS certificate expiry or pulling updated blocklists.

Common pitfalls with 0 */6 * * *

* */6 * * * runs every minute, not every 6 hours

This is the most common mistake with hour steps. With * in the minute field, the job runs at 00:00, 00:01 … 00:59, then again from 06:00 to 06:59, and so on: 240 runs a day. Always set the minute explicitly.

# WRONG: every minute during hours 0, 6, 12, 18 (240 runs/day)
* */6 * * *

# RIGHT: once at the start of hours 0, 6, 12, 18 (4 runs/day)
0 */6 * * *

The grid starts at midnight, not at deploy time

Deploying at 13:30 does not give you runs at 19:30 and 01:30. The next run is 18:00. If you want a different phase, list the hours or use a range-step such as 0 3-23/6 * * * (03:00, 09:00, 15:00, 21:00).

Only use steps that divide 24

*/6 works because 24 is divisible by 6. */5 in the hour field gives 0, 5, 10, 15, 20 and then 0 again, so the last gap is only 4 hours. Use 2, 3, 4, 6, 8 or 12 for evenly spaced hour steps.

Related cron expressions

Need a different schedule? Paste 0 */6 * * * into the Cron Builder and edit it, browse all cron expressions, read the cron syntax guide or copy from the cron examples list.

Frequently Asked Questions

What does 0 */6 * * * mean?▾

Every 6 hours on the hour: at 00:00, 06:00, 12:00 and 18:00 in the scheduler's timezone. The 0 is the minute and */6 is the hour step.

What is the AWS cron expression for every 6 hours?▾

cron(0 0/6 * * ? *), which fires at 00:00, 06:00, 12:00 and 18:00 UTC. Alternatively rate(6 hours), which keeps a 6-hour interval from whenever the schedule was created.

How do I run a cron job every 6 hours starting at 3 AM?▾

Use 0 3-23/6 * * * or the explicit list 0 3,9,15,21 * * *. Both run at 03:00, 09:00, 15:00 and 21:00.