0 3 * * 0
At 03:00 on Sunday
Field by Field
| Field | Value | Matches |
|---|---|---|
| Minute | 0 | 0 |
| Hour | 3 | 3 |
| Day of month | * | every day |
| Month | * | every month |
| Day of week | 0 | 0 |
Sunday Is 0, and Sometimes 7
The day-of-week field is 0–6 starting at Sunday. Most implementations also accept 7 as
Sunday, for compatibility with systems that number Monday as 1. Both 0 0 * * 0 and
0 0 * * 7 work on Vixie cron and its descendants; only the first is universally safe.
Named days are clearer still: 0 3 * * SUN is supported by most modern schedulers and is
much harder to misread in a review.
The 03:00 hour is chosen rather than midnight: every daily and weekly job that nobody thought about fires at 00:00, and three in the morning is the emptiest hour of the week.
Weekly Jobs Accumulate a Week of Risk
Whatever a weekly job does, it does with seven days of accumulated input. A daily job that handles 1,000 rows handles 7,000 here, and the failure modes — timeouts, memory, lock contention — appear at the larger size first.
Test weekly jobs against a full week of realistic data, not against yesterday's.
"Sunday" Is Ambiguous in Prose
"Sunday at midnight" means the start of Sunday to a scheduler and the end of Sunday to most
people. 0 0 * * 0 is the *start*: the instant after Saturday ends. If you meant the end
of Sunday, you want 0 0 * * 1.
Naming the hour explicitly, as this schedule does, removes the ambiguity entirely — nobody misreads "three in the morning on Sunday".
Time Zones
Standard crontab evaluates in system local time. Vercel Cron, GitHub Actions, Kubernetes
CronJobs and AWS EventBridge all evaluate in UTC. If converting your local time crosses
midnight, the day-of-week field shifts too — weekdays at 5pm in UTC-07:00 is
0 0 * * 2-6, not 0 0 * * 1-5.
The Day-Field Trap
When both the day-of-month and day-of-week fields are restricted, cron matches either,
not both. 0 0 13 * 5 runs on every 13th *and* every Friday — not Friday the 13th. Leave
one of them as * unless you genuinely want the union.
Other Common Schedules
| Expression | Runs |
|---|---|
* * * * * | Every minute |
*/5 * * * * | Every 5 minutes |
*/15 * * * * | Every 15 minutes |
0 * * * * | Every hour, on the hour |
0 0 * * * | Every day at midnight |
0 9 * * * | Every day at 9am |
0 9 * * 1-5 | Weekdays at 9am |
0 9 * * 1 | Every Monday at 9am |
Making the Job Safe
- Assume double firing. DST transitions, restarts and retries all cause it. Make the job
- Assume overlap. Cron starts the next run whether or not the last one finished. Take a
- Avoid
:00. Every hourly job on the internet fires at the top of the hour; a random
- Log the start and end. A cron job that silently stops running is invisible until