HTTPfy

Every day at midnight

At 00:00 every day: once a day, at the start of the day.

Shorthand in Vixie cron, cronie and Kubernetes: @daily

365runs in the next 365 days
7runs per week
1 daybetween every run
00:00next run, Thu 12 Nov UTC

What it is used for

Nightly batch work: database backups, daily reports, purging expired sessions, rotating API keys or rebuilding sitemaps.

Field by field

FieldValueMatches
Minute00
Hour00
Day of month*every value
Month*every value
Day of week*every value
0 0 * * * /path/to/job

Next 10 run times

Computed when this page loaded (2026-11-11 02:24 UTC), assuming the scheduler runs in UTC.

#UTCYour local time
1Thu 2026-11-12 00:00
2Fri 2026-11-13 00:00
3Sat 2026-11-14 00:00
4Sun 2026-11-15 00:00
5Mon 2026-11-16 00:00
6Tue 2026-11-17 00:00
7Wed 2026-11-18 00:00
8Thu 2026-11-19 00:00
9Fri 2026-11-20 00:00
10Sat 2026-11-21 00:00

Things to watch with this schedule

  • Midnight in which zone? System cron uses the server's local time zone (the TZ of the cron daemon), Kubernetes CronJob uses the kube-controller-manager's zone unless spec.timeZone is set, and GitHub Actions and AWS EventBridge rules use UTC. A job meant for midnight in New York runs at 19:00 or 20:00 New York time if the host is on UTC.
  • Many other people's jobs also run at 00:00. If the job calls third-party APIs or a shared database, an off-peak minute like 0 17 * * * or 23 0 * * * avoids contention.

Kubernetes CronJob

Kubernetes uses the same five fields and also accepts @daily. Set spec.timeZone (stable since Kubernetes 1.27), otherwise the schedule follows the time zone of kube-controller-manager.

apiVersion: batch/v1
kind: CronJob
metadata:
  name: every-day-at-midnight
spec:
  schedule: "0 0 * * *"
  timeZone: "Etc/UTC"
  concurrencyPolicy: Forbid
  startingDeadlineSeconds: 300
  jobTemplate:
    spec:
      template:
        spec:
          restartPolicy: OnFailure
          containers:
            - name: job
              image: debian:bookworm-slim
              command: ["/bin/sh", "-c", "/app/run-job.sh"]

GitHub Actions

Workflow schedules use five-field cron in UTC and run only from the default branch. Runs at minute 0 are the most likely to be delayed or dropped when GitHub is busy; an odd minute such as 7 or 23 starts more reliably. The @daily shorthand is not accepted there.

on:
  schedule:
    - cron: '0 0 * * *'   # UTC

jobs:
  run:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: ./run-job.sh

systemd timer

The equivalent OnCalendar= value is *-*-* 00:00:00. Check it with systemd-analyze calendar '*-*-* 00:00:00', which prints the next elapse time. Persistent=true runs a missed job after downtime, which classic cron never does.

[Unit]
Description=Every day at midnight

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

[Install]
WantedBy=timers.target

AWS EventBridge

EventBridge rules take six fields (minute, hour, day-of-month, month, day-of-week, year) in UTC; EventBridge Scheduler can use a time zone. One of day-of-month and day-of-week must be ?, and day-of-week runs 1-7 from Sunday, so names are used here.

cron(0 0 * * ? *)

Quartz Scheduler (Java)

Quartz adds a leading seconds field and needs ? in either day field; days of the week are 1 (SUN) to 7 (SAT).

0 0 0 * * ?

Spring's @Scheduled(cron = ...) also uses six fields, but numbers days of the week 0-7 with Sunday as 0 or 7, like Unix cron; the names shown above work in both.

Related schedules