Quick Reference

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

PositionFieldRangeSpecial CharsNotes
1stMinute0–59* , - /0 = top of hour
2ndHour0–23* , - /24-hour clock, UTC by default
3rdDay of Month1–31* , - /Interacts with Day of Week
4thMonth1–12* , - /JAN–DEC names work on most platforms
5thDay of Week0–7* , - /0 and 7 are both Sunday; SUN–SAT names supported

Special Characters

*
WildcardAny value

* in Hour = every hour

,
ListMultiple values

1,15 in Day = 1st and 15th

-
RangeInclusive range

1-5 in Day of Week = Mon–Fri

/
StepEvery N steps

*/5 in Minute = every 5 minutes

?
Any (no-care)Skip this field (Quartz / Spring)

? in Day = don't care

L
LastLast day of month/week (Quartz)

L in Day = last day of month

W
WeekdayNearest weekday (Quartz)

15W = nearest weekday to 15th

#
Nth weekdayNth occurrence in month (Quartz)

2#3 = 3rd Tuesday

@ Shortcuts (Macros)

Supported by Linux crontab, many schedulers. Not available in GitHub Actions or AWS EventBridge.

MacroEquivalentDescription
@yearly / @annually0 0 1 1 *Once a year, midnight Jan 1
@monthly0 0 1 * *Once a month, midnight 1st
@weekly0 0 * * 0Once a week, midnight Sunday
@daily / @midnight0 0 * * *Once a day, midnight
@hourly0 * * * *Once an hour, top of hour
@rebootOnce at startup (crontab only)

Common Patterns by Category

Every N Minutes

ExpressionMeaning
* * * * *Every minute
*/2 * * * *Every 2 minutes
*/5 * * * *Every 5 minutes
*/10 * * * *Every 10 minutes
*/15 * * * *Every 15 minutes
*/30 * * * *Every 30 minutes

Hourly

ExpressionMeaning
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

ExpressionMeaning
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

ExpressionMeaning
0 9 * * 1-5Weekdays at 9 AM
0 17 * * 1-5Weekdays at 5 PM
0 8-18 * * 1-5Every hour, business hours (8–18)
*/15 9-17 * * 1-5Every 15 min during business hours
0 0 * * 1-5Weekday midnights
0 12 * * 1-5Weekday noon

Weekly

ExpressionMeaning
0 0 * * 0Every Sunday midnight
0 0 * * 1Every Monday midnight
0 9 * * 1Every Monday at 9 AM
0 0 * * 6Every Saturday midnight
0 0 * * 0,6Every weekend midnight
0 18 * * 5Every Friday at 6 PM

Monthly

ExpressionMeaning
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 * 01st of month or Sunday (union)

Yearly / Quarterly

ExpressionMeaning
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-field
MIN 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.sh

Every Sunday at 2 AM

GitHub Actions

5-field
MIN 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-5

Weekdays at 8:00 AM UTC (in schedule.cron)

Kubernetes CronJob

5-field
MIN 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-5

Weekdays at 9 AM (with seconds field = 0)

GCP Cloud Scheduler

5-field
MIN 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

1

Day of Week 0 vs 7

Both 0 and 7 mean Sunday in Linux crontab. Some platforms differ — check your scheduler.

2

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.

3

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.

4

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.

5

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.

6

AWS EventBridge DOM/DOW wildcard

EventBridge requires one of DOM or DOW to be ? (not *). Using * in both fields is invalid.

7

Minimum interval limits

GitHub Actions enforces a minimum of 5-minute intervals. Some platforms (Vercel Cron on free tier) restrict to daily.

8

@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.