Skip to content

@daily

Alias:@midnight

Every Day at Midnight. The @daily cron macro runs at 00:00 every day — identical to 0 0 * * *. See exactly when it fires, timezone caveats, Quartz and AWS equivalents, and simulate it live.

Where the @daily macro is supported and its equivalents
DialectExpression
Unix cron / Cloudflare@daily
Quartz / Spring0 0 0 * * ?
AWS EventBridge0 0 * * ? *

Next 5 executions of @daily (UTC)

Next 5 execution times in UTC for @daily
#Execution time (UTC)
12026-11-03 00:00 UTC
22026-11-04 00:00 UTC
32026-11-05 00:00 UTC
42026-11-06 00:00 UTC
52026-11-07 00:00 UTC
Edit & simulate @daily in your timezone

@daily in production

What @daily actually does

@daily is a Vixie-cron shorthand: instead of writing five fields, the macro expands to exactly 0 0 * * * — minute 0, hour 0, every day of the month, every month, every day of the week. It fires once a day at 00:00 in the timezone the cron daemon itself runs in, which on a modern server is almost always UTC. The @midnight alias is accepted everywhere @daily is and behaves identically; macro names are case-insensitive, so @DAILY parses too.

The expansion happens before the scheduler ever sees your line, which is why @daily and 0 0 * * * are indistinguishable in every observable way: same run times, same logs, same environment. Write the macro when a human will read the crontab; write the five fields when a tool will parse it — plenty of cron testers, linters, and schedulers reject macros outright, which is exactly the confusion that sends people to this page.

Where @daily breaks down

Platform support is the practical limit. Quartz and Spring's @Scheduled reject @daily — Quartz requires '?' in one day field, so the equivalent is 0 0 0 * * ?. AWS EventBridge likewise wants 0 0 * * ? * (six fields, trailing year, '?' in day-of-week). Kubernetes CronJobs accept only the five-field form. Alpine's busybox crond does not implement macros at all, while mainstream Linux (Debian, Ubuntu, RHEL) and macOS ship Vixie-compatible daemons that do.

The classic confusion: /etc/cron.daily/ is NOT @daily. That directory is anacron territory on most distros — jobs run with a randomized delay, at most once a day, serialized, and skipped if the machine was off. @daily in a user crontab fires precisely at 00:00 with no delay and no catch-up. Same intent, completely different machinery — worth knowing before you debug why a job "missed" its window.

Common questions

What time does @daily run?

At 00:00 (midnight) in the cron daemon's own timezone. On cloud servers that timezone is nearly always UTC, so the job fires at 00:00 UTC; on a laptop or on-prem box it follows the system clock. Check with `date` on the host — cron does not consult your shell's TZ variable.

Is @daily exactly the same as 0 0 * * *?

Yes. The macro expands to that five-field expression before scheduling, so run times, logging, and environment are identical. Use the macro for readability; use the expansion for portability across tools that don't parse macros.

Does @daily work in Quartz, Spring, or AWS EventBridge?

No. Quartz and Spring's @Scheduled require explicit fields — the Quartz equivalent is 0 0 0 * * ? — and AWS EventBridge needs 0 0 * * ? *. Neither platform implements Vixie macros.

Why does @daily fail in some cron testers?

Many popular testers only implement the five-field grammar and treat a macro as a one-token error. This simulator expands @daily (and the other macros) natively in the Unix and Cloudflare dialects, showing the expanded fields, the next runs, and the plain-English meaning.

All cron shortcut macros