The Complete Guide to Cron Expressions for Developers
Cron expressions are one of those things that look cryptic at first but follow a simple pattern. Once you know the five fields, you can read and write any schedule without Googling it.
The five fields
# ββββββ minute (0β59) # β ββββββ hour (0β23) # β β ββββββ day of month (1β31) # β β β ββββββ month (1β12 or JANβDEC) # β β β β ββββββ day of week (0β7, 0 and 7 = Sunday, or SUNβSAT) # β β β β β * * * * *
The special characters
*β any value ("every"),β list of values:1,15= on the 1st and 15th-β range:9-17= 9am through 5pm/β step:*/5= every 5 units
20 patterns you'll actually use
0 * * * * # Every hour on the hour */15 * * * * # Every 15 minutes 0 9 * * 1-5 # 9am weekdays 0 9 * * MON # Every Monday at 9am 0 0 * * * # Midnight every day 0 0 1 * * # Midnight on the 1st of each month 0 0 1 1 * # Midnight on Jan 1st (yearly) 0 */6 * * * # Every 6 hours 30 8 * * 1 # 8:30am every Monday 0 9,17 * * * # 9am and 5pm daily 0 0 * * 0 # Midnight every Sunday 0 12 * * 5 # Noon every Friday 0 0 15 * * # Midnight on the 15th */30 9-17 * * 1-5 # Every 30min, 9amβ5pm weekdays 0 0 * 1,7 * # Midnight in Jan and Jul
Platform differences
GitHub Actions uses standard 5-field cron but runs on UTC. The minimum interval is 5 minutes (GitHub throttles more frequent schedules). Note that scheduled workflows may be delayed by up to an hour during heavy load.
AWS EventBridge uses a 6-field format adding a year field, and requires either day-of-month or day-of-week to be ? (not both specified): 0 9 ? * MON *.
Kubernetes CronJobs use standard 5-field cron in UTC by default. Add timeZone: "America/New_York" to the CronJob spec to use a local timezone (requires Kubernetes 1.27+).
Common mistakes
- Forgetting UTC β most systems run cron in UTC.
0 9 * * *fires at 9am UTC, which is 2:30pm IST or 4am PST. - Both DOM and DOW β in most implementations, specifying both day-of-month and day-of-week creates OR logic, not AND.
- Minimum interval β GitHub Actions won't reliably run more often than every 5 minutes. Use a queue or event-driven trigger instead.
Unsure what a cron expression means? Paste any expression into the Aarunya Cron Explainer β it translates the expression to plain English, shows the next 8 run times, and generates platform snippets for GitHub Actions, Kubernetes, AWS EventBridge, and systemd.
Enjoyed this? Get notified when Pro launches.
