The expression
0 9 * * *
Runs once a day at 09:00, every day of the week, including weekends.
| Field | Value | Meaning |
|---|---|---|
| Minute | 0 |
at minute 0 |
| Hour | 9 |
at 9 a.m. (hours are 0-23) |
| Day of month | * |
every day |
| Month | * |
every month |
| Day of week | * |
every day of the week |
Cron uses a 24-hour clock with no a.m./p.m., so 9 a.m. is 9 and 9 p.m. is 21. The question that matters is whose 9 a.m.: cron uses the time zone of the machine or scheduler running it.
Variants
| Schedule | Expression |
|---|---|
| Every day at 9:30 | 30 9 * * * |
| Every day at 9 p.m. | 0 21 * * * |
| Weekdays at 9:00 | 0 9 * * 1-5 |
| 9:00 and 21:00 | 0 9,21 * * * |
| Every hour from 9 to 17 on weekdays | 0 9-17 * * 1-5 |
| Every day at midnight | 0 0 * * * |
Where to write it
- crontab (Linux, macOS):
0 9 * * * /usr/local/bin/morning-report.shincrontab -e. Check the server zone withtimedatectl; on cronie you can putCRON_TZ=Europe/Parisat the top of the crontab to get 9 a.m. Paris time regardless. - GitHub Actions: schedules are always UTC, so convert. 9 a.m. in New York is
0 13 * * *during daylight saving time (EDT, UTC-4) and0 14 * * *in winter (EST, UTC-5); 9 a.m. in London is0 8 * * *in summer and0 9 * * *in winter. Either update it twice a year or accept an hour of drift. - Kubernetes CronJob:
schedule: "0 9 * * *"withtimeZone: "America/New_York", which follows daylight saving automatically (stable since Kubernetes 1.27). - AWS EventBridge: rules use UTC:
cron(0 9 * * ? *)is 09:00 UTC. EventBridge Scheduler accepts a time zone (ScheduleExpressionTimezone), which keeps 9 a.m. local through DST.
Common mistakes
* 9 * * *runs 60 times, every minute from 9:00 to 9:59.9 * * * *runs every hour, at nine minutes past.0 9 * * *includes weekends. Add1-5in the last field for Monday to Friday.- DST on UTC schedulers. A fixed UTC hour moves by an hour locally twice a year in zones with daylight saving.
Paste any expression into the Cron Expression Parser to see it in words and its next run times.