Linux cron

0 4 * * 0

Quartz cron

0 0 4 * * 0

What this schedule does

0 4 * * 0 runs at 04:00 every sunday. In standard Linux cron, the five fields are minute, hour, day of month, month, and day of week. The equivalent Quartz-style expression is 0 0 4 * * 0, which usually adds a seconds field at the beginning.

Treat the expression as a trigger, not as a complete job policy. Timezone, retries, locking, alerting, and missed-run behavior are controlled by the scheduler or by your application code.

Field breakdown

FieldValueMeaningPractical note
Minute0Minute field is 0.Specific minute: 0.
Hour4Hour field is 4.Specific hour: 4.
Day of month*Day-of-month field is *.Every valid day of month.
Month*Month field is *.Every valid month.
Day of week0Day-of-week field is 0.Specific day of week: 0.

Field reference

Read 0 4 * * 0 from left to right as minute, hour, day of month, month, and day of week. A value of * means every valid value, */n means every n units, commas select multiple values, and ranges select a continuous span.

FieldAllowed valuesCommon syntaxImplementation note
Minute0-59*, comma lists, ranges, and stepsUse small intervals only for lightweight or locked jobs.
Hour0-2324-hour UTC or scheduler-local valuesCheck whether the platform evaluates in UTC before copying the schedule.
Day of month1-31Exact days, ranges, steps, or *Month length can skip impossible dates such as the 31st in shorter months.
Month1-12 or JAN-DECNumeric or named months where supportedNamed months are convenient but not accepted by every parser.
Day of week0-7 or SUN-SAT0 and 7 usually both mean SundaySome schedulers combine day-of-month and day-of-week differently.

Next 10 UTC run times

#UTC timeISO 8601Relative
1Sun, 02 Aug 2026 04:00:00 GMT2026-08-02T04:00:00.000Zin 42 hr 3 min
2Sun, 09 Aug 2026 04:00:00 GMT2026-08-09T04:00:00.000Zin 8 days 18 hr
3Sun, 16 Aug 2026 04:00:00 GMT2026-08-16T04:00:00.000Zin 15 days 18 hr
4Sun, 23 Aug 2026 04:00:00 GMT2026-08-23T04:00:00.000Zin 22 days 18 hr
5Sun, 30 Aug 2026 04:00:00 GMT2026-08-30T04:00:00.000Zin 29 days 18 hr
6Sun, 06 Sep 2026 04:00:00 GMT2026-09-06T04:00:00.000Zin 36 days 18 hr
7Sun, 13 Sep 2026 04:00:00 GMT2026-09-13T04:00:00.000Zin 43 days 18 hr
8Sun, 20 Sep 2026 04:00:00 GMT2026-09-20T04:00:00.000Zin 50 days 18 hr
9Sun, 27 Sep 2026 04:00:00 GMT2026-09-27T04:00:00.000Zin 57 days 18 hr
10Sun, 04 Oct 2026 04:00:00 GMT2026-10-04T04:00:00.000Zin 64 days 18 hr

Linux crontab

0 4 * * 0 /usr/local/bin/job.sh

GitHub Actions

on:
  schedule:
    - cron: "0 4 * * 0"

Kubernetes CronJob

apiVersion: batch/v1
kind: CronJob
spec:
  schedule: "0 4 * * 0"
  jobTemplate:
    spec:
      template:
        spec:
          restartPolicy: OnFailure

Jenkins Pipeline

pipeline {
  triggers { cron('0 4 * * 0') }
}

AWS EventBridge note

EventBridge schedule expression:
cron(0 4 ? * 0 *)

Node.js node-cron

import cron from "node-cron";

cron.schedule("0 4 * * 0", async () => {
  await runJob();
}, { timezone: "UTC" });

Python APScheduler

from apscheduler.triggers.cron import CronTrigger
from apscheduler.schedulers.background import BackgroundScheduler

scheduler = BackgroundScheduler(timezone="UTC")
scheduler.add_job(run_job, CronTrigger.from_crontab("0 4 * * 0"))
scheduler.start()

Go robfig/cron

import "github.com/robfig/cron/v3"

c := cron.New(cron.WithLocation(time.UTC))
c.AddFunc("0 4 * * 0", runJob)
c.Start()

Spring scheduled job

@Scheduled(cron = "0 0 4 * * 0", zone = "UTC")
public void runJob() {
    // keep this method idempotent
}

Good use cases

  • Run repeatable maintenance, reporting, automation, or background processing tasks.
  • Use the schedule for jobs that can tolerate cron-style timing instead of real-time events.
  • Keep the job idempotent so manual retries and delayed starts remain safe.

Production checklist

CheckWhy it matters
TimezoneConfirm whether the scheduler uses UTC, server local time, or an explicit timezone setting.
OverlapMake the job idempotent or add a lock if one run can last longer than the interval.
RetriesCron starts jobs; it does not define retry, backoff, alerting, or dead-letter behavior.
Platform syntaxThis is standard five-field cron syntax for Linux-style schedulers.
MonitoringLog the scheduled time, actual start time, duration, exit code, and next expected run.

Runtime decisions

Before this schedule goes live, decide what should happen when a previous run is still active, when the server restarts during a scheduled minute, and when the job fails after partially changing data. Those rules are usually more important than the cron string itself.

DecisionRecommended defaultReason
TimezoneUse UTC unless the job is tied to a local business day.UTC avoids daylight-saving surprises and makes logs easier to compare.
ConcurrencyAllow only one active run for state-changing jobs.Overlapping runs can duplicate emails, invoices, imports, or cleanup work.
Missed startsRecord the intended scheduled time and decide whether to catch up.Some platforms skip missed runs while others start late after downtime.
RetriesUse application-level retries with bounded backoff.Cron only triggers the job; it does not know whether the work completed correctly.

Platform differences

PlatformTypical formatImportant behavior
Linux crontab0 4 * * 0Five fields. Usually runs in the server timezone unless the environment or cron implementation sets another timezone.
GitHub Actions0 4 * * 0Uses five-field cron and evaluates schedules in UTC. Jobs may be delayed during high load.
Kubernetes CronJob0 4 * * 0Controller behavior controls missed starts, concurrency policy, history limits, and timezone support.
Quartz / Spring0 0 4 * * 0Often uses seconds and supports ?, L, and other non-Linux cron features.

Usage notes

Sunday Maintenance is useful for scheduled maintenance, reporting, automation, and background jobs. Confirm the scheduler time zone and platform syntax before deploying it to production.

Platform difference: standard Linux cron uses five fields. Quartz and AWS style schedules often add seconds or year fields and use ? for “no specific value”. GitHub Actions evaluates cron in UTC. Kubernetes follows standard cron syntax through the controller timezone unless configured otherwise.

Common mistake: copying a Quartz expression into Linux crontab without removing the seconds field. Another common issue is assuming local time when the platform evaluates schedules in UTC.