The expression
0 9 * * * /path/to/your/script.sh
Reads as: at minute 0 of hour 9, every day, every month, every weekday. So once a day at 9:00 AM.
Common daily times
| Expression | Time |
|---|---|
0 0 * * * | Midnight (12:00 AM) |
0 1 * * * | 1:00 AM |
0 6 * * * | 6:00 AM |
30 8 * * * | 8:30 AM |
0 9 * * * | 9:00 AM |
0 12 * * * | Noon |
0 17 * * * | 5:00 PM |
30 23 * * * | 11:30 PM |
Cron uses 24-hour time: 0 is midnight, 12 is noon, 23 is 11 PM. There's no AM/PM in the syntax.
Macros for common daily times
@dailyor@midnight— same as0 0 * * *(midnight)
For any other time, use the explicit MINUTE HOUR * * * form.
The timezone gotcha
Cron uses the system's timezone, which is usually UTC on cloud servers. So 0 9 * * * on AWS, GCP, or most Linux VMs means 9 AM UTC, not 9 AM where you live.
To run "9 AM Eastern" from a UTC server, calculate the UTC equivalent:
| Local time wanted | UTC offset | Cron expression |
|---|---|---|
| 9 AM Pacific (PST) | UTC-8 | 0 17 * * * |
| 9 AM Eastern (EST) | UTC-5 | 0 14 * * * |
| 9 AM London (GMT) | UTC+0 | 0 9 * * * |
| 9 AM Tokyo (JST) | UTC+9 | 0 0 * * * |
Note these drift during daylight saving time. See our DST guide for the three strategies.
Alternative: set CRON_TZ
On Vixie cron (most Linux distributions), you can override the timezone at the top of the crontab:
CRON_TZ=America/New_York 0 9 * * * /path/to/script.sh # Now this means 9 AM Eastern