Cron Expressions Explained: 15 Real Schedules and the Time Zone Traps
Cron syntax fits on one line and still trips up everyone eventually — usually at 2 a.m. on the night daylight saving time changes. Here is how the five fields work, a set of schedules you can copy, and the traps worth knowing.
The five fields
┌──────── minute (0–59)
│ ┌────── hour (0–23)
│ │ ┌──── day of month (1–31)
│ │ │ ┌── month (1–12)
│ │ │ │ ┌ day of week (0–6, Sunday = 0)
* * * * *
Each field takes a value (5), a list (1,15), a range (1-5), a step (*/10) or * for every value. Some systems (Quartz, AWS EventBridge) add a seconds or year field — check which flavor you are writing for.
Schedules to copy
| Expression | Runs |
|---|---|
*/5 * * * * | Every 5 minutes |
0 * * * * | Every hour, on the hour |
15 */2 * * * | At :15 every 2 hours |
0 9 * * * | Every day at 09:00 |
30 2 * * * | Every day at 02:30 (see the DST trap below) |
0 9 * * 1-5 | Weekdays at 09:00 |
0 18 * * 5 | Fridays at 18:00 |
0 0 * * 0 | Sundays at midnight |
0 0 1 * * | First day of every month |
0 0 1 1 * | Once a year, January 1 |
0 8 1,15 * * | The 1st and 15th at 08:00 |
*/15 9-17 * * 1-5 | Every 15 minutes during office hours |
0 0 * * 6,0 | Midnight on weekends |
0 3 * 1,4,7,10 * | Daily at 03:00 in the first month of each quarter |
0 12 * * * | Daily at noon |
Build or translate any expression into plain English with the Cron Expression Generator, which also lists the next run times.
The day-of-month vs day-of-week trap
When both the day-of-month and day-of-week fields are restricted, standard cron runs when either matches — not both. 0 9 13 * 5 runs on the 13th of every month and every Friday, not only on Friday the 13th. To run on the last weekday or the first Monday, schedule daily and check the date in your script, or use a scheduler with extensions like L and #.
Time zones and daylight saving time
- Servers and CI run in UTC. GitHub Actions schedules, most containers and cloud schedulers use UTC. 09:00 in New York is
0 14 * * *in winter and0 13 * * *in summer. Convert with the Time Zone Converter, or see several zones at once on the World Clock. - Jobs between 01:00 and 03:00 local time are risky. When clocks spring forward, 02:30 doesn’t exist and the job may be skipped; when they fall back, it can run twice. Schedule critical jobs outside that window, or run the scheduler in UTC.
- GitHub Actions schedules can start several minutes late at busy times and are disabled on repositories without activity for 60 days. Generate a workflow with the GitHub Actions Generator.