@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.