Linux cron

0 0 * * *

Quartz cron

0 0 0 * * *

What this schedule does

0 0 * * * runs every day at 00:00. 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 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.
Hour0Hour field is 0.Specific hour: 0.
Day of month*Day-of-month field is *.Every valid day of month.
Month*Month field is *.Every valid month.
Day of week*Day-of-week field is *.Every valid day of week.

Field reference

Read 0 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
1Sat, 01 Aug 2026 00:00:00 GMT2026-08-01T00:00:00.000Zin 14 hr 3 min
2Sun, 02 Aug 2026 00:00:00 GMT2026-08-02T00:00:00.000Zin 38 hr 3 min
3Mon, 03 Aug 2026 00:00:00 GMT2026-08-03T00:00:00.000Zin 2 days 14 hr
4Tue, 04 Aug 2026 00:00:00 GMT2026-08-04T00:00:00.000Zin 3 days 14 hr
5Wed, 05 Aug 2026 00:00:00 GMT2026-08-05T00:00:00.000Zin 4 days 14 hr
6Thu, 06 Aug 2026 00:00:00 GMT2026-08-06T00:00:00.000Zin 5 days 14 hr
7Fri, 07 Aug 2026 00:00:00 GMT2026-08-07T00:00:00.000Zin 6 days 14 hr
8Sat, 08 Aug 2026 00:00:00 GMT2026-08-08T00:00:00.000Zin 7 days 14 hr
9Sun, 09 Aug 2026 00:00:00 GMT2026-08-09T00:00:00.000Zin 8 days 14 hr
10Mon, 10 Aug 2026 00:00:00 GMT2026-08-10T00:00:00.000Zin 9 days 14 hr

Linux crontab

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

GitHub Actions

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

Kubernetes CronJob

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

Jenkins Pipeline

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

AWS EventBridge note

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

Node.js node-cron

import cron from "node-cron";

cron.schedule("0 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 0 * * *"))
scheduler.start()

Go robfig/cron

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

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

Spring scheduled job

@Scheduled(cron = "0 0 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 0 * * *Five fields. Usually runs in the server timezone unless the environment or cron implementation sets another timezone.
GitHub Actions0 0 * * *Uses five-field cron and evaluates schedules in UTC. Jobs may be delayed during high load.
Kubernetes CronJob0 0 * * *Controller behavior controls missed starts, concurrency policy, history limits, and timezone support.
Quartz / Spring0 0 0 * * *Often uses seconds and supports ?, L, and other non-Linux cron features.

Usage notes

Daily at Midnight 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.