Field by field
| Position | Field | Value | Means |
|---|---|---|---|
| 1 | Minute | 0 | At minute 0 (top of the hour) |
| 2 | Hour | 0 | At hour 0 (midnight in 24-hour time) |
| 3 | Day of month | * | Any day |
| 4 | Month | * | Any month |
| 5 | Day of week | * | Any day of the week |
Putting it all together: at minute 0 of hour 0, every day, every month, every weekday — which simplifies to "midnight, every day."
Equivalent expressions
Several common forms produce the same schedule:
| Form | Same as |
|---|---|
0 0 * * * | Explicit form |
@daily | Macro (most Linux distros support it) |
@midnight | Macro alias (less common) |
AWS EventBridge and GitHub Actions do NOT support macros — use 0 0 * * * there.
Common similar expressions
| Expression | Meaning |
|---|---|
0 0 * * * | Midnight every day |
0 0 1 * * | Midnight on the 1st of every month |
0 0 * * 0 | Midnight every Sunday |
0 0 * * 1 | Midnight every Monday |
0 12 * * * | Noon every day |
0 0 1 1 * | Midnight on January 1st (yearly) |
Timezone gotcha
"Midnight" means midnight in the system's timezone, which is usually UTC on cloud servers. So 0 0 * * * on AWS / GitHub Actions / most Linux VMs means midnight UTC:
- 4 PM Pacific (previous day)
- 7 PM Eastern (previous day)
- 9 AM Tokyo (same day)
To run at "midnight local time," either set CRON_TZ in your crontab, change the system timezone, or calculate the UTC equivalent of your local midnight.