Cron Expression Cheat Sheet
Fields, special characters, common patterns, and platform-specific syntax for crontab, GitHub Actions, Kubernetes, AWS EventBridge, and more — all in one page.
Field Reference
Standard 5-field cron format: MIN HOUR DOM MON DOW
| Position | Field | Range | Special Chars | Notes |
|---|---|---|---|---|
| 1st | Minute | 0–59 | * , - / | 0 = top of hour |
| 2nd | Hour | 0–23 | * , - / | 24-hour clock, UTC by default |
| 3rd | Day of Month | 1–31 | * , - / | Interacts with Day of Week |
| 4th | Month | 1–12 | * , - / | JAN–DEC names work on most platforms |
| 5th | Day of Week | 0–7 | * , - / | 0 and 7 are both Sunday; SUN–SAT names supported |
Special Characters
* in Hour = every hour
1,15 in Day = 1st and 15th
1-5 in Day of Week = Mon–Fri
*/5 in Minute = every 5 minutes
? in Day = don't care
L in Day = last day of month
15W = nearest weekday to 15th
2#3 = 3rd Tuesday
@ Shortcuts (Macros)
Supported by Linux crontab, many schedulers. Not available in GitHub Actions or AWS EventBridge.
| Macro | Equivalent | Description |
|---|---|---|
| @yearly / @annually | 0 0 1 1 * | Once a year, midnight Jan 1 |
| @monthly | 0 0 1 * * | Once a month, midnight 1st |
| @weekly | 0 0 * * 0 | Once a week, midnight Sunday |
| @daily / @midnight | 0 0 * * * | Once a day, midnight |
| @hourly | 0 * * * * | Once an hour, top of hour |
| @reboot | — | Once at startup (crontab only) |
Common Patterns by Category
Every N Minutes
| Expression | Meaning |
|---|---|
| * * * * * | Every minute |
| */2 * * * * | Every 2 minutes |
| */5 * * * * | Every 5 minutes |
| */10 * * * * | Every 10 minutes |
| */15 * * * * | Every 15 minutes |
| */30 * * * * | Every 30 minutes |
Hourly
| Expression | Meaning |
|---|---|
| 0 * * * * | Every hour (top of hour) |
| 30 * * * * | Every hour at :30 |
| 0 */2 * * * | Every 2 hours |
| 0 */4 * * * | Every 4 hours |
| 0 */6 * * * | Every 6 hours |
| 0 */12 * * * | Every 12 hours |
Daily
| Expression | Meaning |
|---|---|
| 0 0 * * * | Daily at midnight |
| 0 1 * * * | Daily at 1:00 AM |
| 0 6 * * * | Daily at 6:00 AM |
| 0 9 * * * | Daily at 9:00 AM |
| 0 12 * * * | Daily at noon |
| 0 18 * * * | Daily at 6:00 PM |
| 30 4 * * * | Daily at 4:30 AM |
| 0 23 * * * | Daily at 11:00 PM |
Weekdays / Business Hours
| Expression | Meaning |
|---|---|
| 0 9 * * 1-5 | Weekdays at 9 AM |
| 0 17 * * 1-5 | Weekdays at 5 PM |
| 0 8-18 * * 1-5 | Every hour, business hours (8–18) |
| */15 9-17 * * 1-5 | Every 15 min during business hours |
| 0 0 * * 1-5 | Weekday midnights |
| 0 12 * * 1-5 | Weekday noon |
Weekly
| Expression | Meaning |
|---|---|
| 0 0 * * 0 | Every Sunday midnight |
| 0 0 * * 1 | Every Monday midnight |
| 0 9 * * 1 | Every Monday at 9 AM |
| 0 0 * * 6 | Every Saturday midnight |
| 0 0 * * 0,6 | Every weekend midnight |
| 0 18 * * 5 | Every Friday at 6 PM |
Monthly
| Expression | Meaning |
|---|---|
| 0 0 1 * * | 1st of every month |
| 0 0 15 * * | 15th of every month |
| 0 0 1,15 * * | 1st and 15th of month |
| 0 0 28 * * | 28th of every month |
| 0 0 1 1,7 * | Jan 1st and Jul 1st |
| 0 0 1 * 0 | 1st of month or Sunday (union) |
Yearly / Quarterly
| Expression | Meaning |
|---|---|
| 0 0 1 1 * | New Year's Day (Jan 1) |
| 0 0 1 1,4,7,10 * | Quarterly (Q1–Q4 start) |
| 0 0 31 3 * | March 31 (Q1 end) |
| 0 0 30 6 * | June 30 (Q2 end) |
| 0 0 30 9 * | September 30 (Q3 end) |
| 0 0 31 12 * | December 31 |
Platform-Specific Syntax
Linux crontab
5-fieldMIN HOUR DOM MON DOW command- •0 and 7 both mean Sunday
- •Month/weekday names: JAN–DEC, SUN–SAT
- •No seconds field
- •@reboot, @daily, @weekly macros supported
Example:
0 2 * * 0 /usr/local/bin/backup.shEvery Sunday at 2 AM
GitHub Actions
5-fieldMIN HOUR DOM MON DOW (UTC)- •Always UTC — no timezone support
- •5-field POSIX format only
- •Minimum interval: every 5 minutes
- •GitHub may delay by up to 15 min under high load
Example:
0 8 * * 1-5Weekdays at 8:00 AM UTC (in schedule.cron)
Kubernetes CronJob
5-fieldMIN HOUR DOM MON DOW- •5-field POSIX format
- •Timezone: controller TZ (often UTC)
- •.spec.schedule field in CronJob spec
- •@every 1h syntax also supported
Example:
*/5 * * * *Every 5 minutes (spec.schedule)
AWS EventBridge
6-field +MIN HOUR DOM MON DOW YEAR- •6-field format adds Year
- •Uses ? instead of * for wildcards on DOM or DOW (one must be ?)
- •Rate expressions also supported: rate(5 minutes)
- •L and W supported for DOM; # supported for DOW
Example:
0 12 * * ? *Daily at noon UTC
Azure Logic Apps / WebJobs
6-field +SEC MIN HOUR DOM MON DOW- •6-field format with Seconds prepended
- •NCronTab library under the hood
- •Runs in configured time zone of the App Service Plan
Example:
0 0 9 * * 1-5Weekdays at 9 AM (with seconds field = 0)
GCP Cloud Scheduler
5-fieldMIN HOUR DOM MON DOW- •5-field POSIX format
- •Supports time zone via scheduler config (not in expression)
- •Apps Engine cron.yaml uses a different syntax
Example:
0 */6 * * *Every 6 hours
Quartz Scheduler (Java)
6-field +SEC MIN HOUR DOM MON DOW [YEAR]- •7 fields: SEC MIN HOUR DOM MON DOW YEAR
- •? for DOM or DOW (must specify one)
- •L (last), W (nearest weekday), # (nth weekday) supported
- •Month: 1–12 or JAN–DEC; DOW: 1–7, SUN=1
Example:
0 30 9 ? * MON-FRI *Weekdays at 9:30 AM
Common Gotchas & Pitfalls
Day of Week 0 vs 7
Both 0 and 7 mean Sunday in Linux crontab. Some platforms differ — check your scheduler.
UTC vs Local Time
GitHub Actions and most cloud schedulers use UTC. AWS EventBridge also runs in UTC unless configured otherwise. Confirm your time zone assumption.
DOM and DOW interaction
If you specify both DOM and DOW, cron runs when EITHER condition is true (OR logic), not AND. Use ? in one field (AWS/Quartz) to restrict to just one.
Step on a range: */5 vs 0-59/5
*/5 in Minute means 0, 5, 10, 15 … 55. It is equivalent to 0-59/5. Not every scheduler evaluates these identically.
Seconds field location
Azure (WebJobs, Logic Apps) and Quartz prepend a Seconds field, making it a 6- or 7-field format. GitHub Actions and Linux crontab use 5 fields without seconds.
AWS EventBridge DOM/DOW wildcard
EventBridge requires one of DOM or DOW to be ? (not *). Using * in both fields is invalid.
Minimum interval limits
GitHub Actions enforces a minimum of 5-minute intervals. Some platforms (Vercel Cron on free tier) restrict to daily.
@every vs cron syntax
Kubernetes and some Go schedulers support "@every 1h" duration syntax alongside standard cron. They are not the same thing — cron expressions are more precise.
Need to validate a cron expression?
Paste any cron expression into our free translator — get plain English, next run times, timezone preview, and lint warnings in one click.