Cron expression: every day at 00:00
0 0 * * *
Runs once a day at 00:00 (12:00 AM) server time.
What each field means
| Field | Value | Meaning |
|---|---|---|
| minute | 0 | minute 0 |
| hour | 0 | hour 0 |
| day of month | * | every day of month |
| month | * | every month |
| day of week | * | every day of week |
Next runs
Starting from 1 January 2026, 00:00 UTC:
- Thursday 1 Jan 00:00
- Friday 2 Jan 00:00
- Saturday 3 Jan 00:00
- Sunday 4 Jan 00:00
- Monday 5 Jan 00:00
- Tuesday 6 Jan 00:00
Things to watch
Remember this is the server's local time zone, not the user's. Run the server in UTC and convert for display if the exact wall-clock time matters to people.
Midnight is the most contended slot on the internet. Log rotation, backups, billing rollovers and a large share of every crontab fire at 00:00, so a job here competes for disk and database with everything else on the machine. It is also the instant the date changes: a job that stamps "today" at 00:00 can disagree with one that started at 23:59, and anything computing "yesterday" is one time-zone conversion away from the wrong day. Unless the job genuinely belongs on the date boundary, a few minutes later is strictly better.
Assuming the server runs UTC, a job firing at this hour lands on the middle of the working day in Tokyo, Sydney; outside working hours but waking or winding down in New York, Singapore; the middle of the night in London, Berlin, Mumbai. That matters less for the machine than for the people: whoever is on call when this breaks is determined by this row, not by the schedule.
| If the server runs UTC, this is | |
|---|---|
| New York | 19:00 (previous day) |
| London | 00:00 |
| Berlin | 01:00 |
| Mumbai | 05:30 |
| Singapore | 08:00 |
| Tokyo | 09:00 |
| Sydney | 11:00 |
The same schedule elsewhere
# crontab
0 0 * * * /usr/local/bin/my-job >> /var/log/my-job.log 2>&1
# GitHub Actions (.github/workflows/job.yml) — always UTC
on:
schedule:
- cron: '0 0 * * *'
# Kubernetes CronJob
spec:
schedule: "0 0 * * *"
# AWS EventBridge — six fields, and ? in one of the day fields
cron(0 0 * * ? *)
Frequently asked questions
What is the cron expression to run a job every day at 00:00?
0 0 * * * — Runs once a day at 00:00 (12:00 AM) server time.
Which time zone does cron use?
The server's local time zone, unless the scheduler says otherwise. GitHub Actions always uses UTC. Kubernetes CronJobs use UTC unless you set spec.timeZone. Running servers in UTC and converting only for display avoids an entire class of daylight-saving bugs.
What happens if the previous run is still going?
Standard cron starts a new one regardless, so long-running jobs can pile up. Wrap the command in flock -n /var/lock/my-job.lock, or set concurrencyPolicy: Forbid on a Kubernetes CronJob.
Why did my cron job not run at all?
The three usual causes: the script is not executable, the command relies on a PATH or environment variable that cron does not set, or output went nowhere because no mail transport is configured. Redirect stdout and stderr to a log file and the reason usually becomes obvious.
Other schedules
- every day at 01:00
- every day at 02:00
- every day at 03:00
- every day at 04:00
- every day at 05:00
- every day at 06:00
- every day at 07:00
- every day at 08:00
- every day at 09:00
- every day at 10:00
- every day at 11:00
- every day at 12:00
- every day at 13:00
- every day at 14:00
- every day at 15:00
- every day at 16:00
- every day at 17:00
- every day at 18:00
- every day at 19:00
- every day at 20:00