0 0 * * * runs a job once a day at 00:00. The first two fields are minute 0 and hour 0, and the rest are *. @daily and @midnight are shortcuts for the same line in most crons.
Whose midnight?
The machine’s. Classic cron uses the system timezone, so a server on UTC runs this at 00:00 UTC, which is the evening before in the Americas. Set CRON_TZ=Europe/Warsaw at the top of a crontab (cronie and others support it), or use a scheduler with a timezone setting, to pin it to a local midnight.
When it fires
Checked at 09:58 UTC on October 14, the next five runs are:
Oct 15 00:00 Oct 16 00:00 Oct 17 00:00 Oct 18 00:00 Oct 19 00:00
Variations
30 2 * * * every day at 02:30
0 0 * * 0 every Sunday at midnight (@weekly)
0 0 1 * * the first of every month at midnight (@monthly)
The same schedule elsewhere
- GitHub Actions:
cron: '0 0 * * *'runs at midnight UTC; midnight is a busy time, so a less round minute starts more reliably. - Kubernetes CronJob:
schedule: "0 0 * * *", withspec.timeZone: "America/New_York"for a local midnight. - AWS EventBridge:
cron(0 0 * * ? *), in UTC unless an EventBridge Scheduler schedule sets a timezone. - systemd timer:
OnCalendar=daily. - Spring
@Scheduled:0 0 0 * * *, withzone = "..."to pick the timezone.