AWS EventBridge Cron Tool
Validate AWS cron() and rate() schedules with EventBridge's real rules — ? required, 1 = Sunday, UTC firing — entirely on this device.
cron(minutes hours day-of-month month day-of-week year)rate(value unit)Six fields, year required. Exactly one of day-of-month or day-of-week carries ? — AWS rejects the expression when both are *.
The plain-language description appears here.
EventBridge rules fire in UTC.
| # | Trigger time (UTC) | Local preview (Local time — for reading only) |
|---|---|---|
| 1 | — | — |
| 2 | — | — |
| 3 | — | — |
| 4 | — | — |
| 5 | — | — |
| 6 | — | — |
| 7 | — | — |
| 8 | — | — |
| 9 | — | — |
| 10 | — | — |
Snippets appear here after a valid schedule.
Press ? for shortcuts
Do it offline:$ aws events put-rule --name nightly-job --schedule-expression 'cron(0 0 * * ? *)'
How to use it
- Paste an expression — cron(), rate(), or the bare six fields — or press Sample.
- Read the badge and the plain-words schedule; a rejection names the exact AWS rule and points at the failing field.
- Scan the next ten trigger times — computed in UTC; the local column merely reformats them.
- Or compose in Builder — its day switch writes the ? into the unused day field for you.
- Copy the expression, take an IaC snippet, or download the report.
Paste an EventBridge schedule expression — cron(…), rate(…), or the bare six fields — and this page checks it against the rules AWS actually enforces: the mandatory question mark, day-of-week counted from 1 = Sunday, a year field, singular rate units. You get the schedule in plain words, the next ten trigger times in UTC with a local reading beside them, and matching Terraform, CloudFormation and CDK snippets. Nothing you type is sent anywhere.
How it works
Validation is a straight read of the published grammar: minutes 0–59, hours 0–23, day-of-month 1–31 (with L and W), month 1–12 or JAN–DEC, day-of-week 1–7 or SUN–SAT (with L and #), year 1970–2199 — six fields, exactly one day field active while the other holds a literal ?. An expression either satisfies every rule or the failing field is named.
Trigger times come from stepping the calendar in UTC, the only clock rules know; the description derives from the same normalized fields. rate() previews are arithmetic — AWS starts the interval at rule creation, so the list assumes creation now.
Examples
cron(0 12 * * ? *)canonical cron(0 12 * * ? *)
description At 12:00
next runs 2026-08-04 12:00 UTC · 2026-08-05 12:00 UTC · 2026-08-06 12:00 UTCMinute 0, hour 12, every day. Day-of-month carries the *, so day-of-week must carry the ? — EventBridge refuses to resolve two day dimensions at once.
cron(0/5 8-17 ? * MON-FRI *)canonical cron(0/5 8-17 ? * MON-FRI *)
description Every 5 minutes, between 08:00 and 17:59, Monday through Friday
next runs 2026-08-04 08:00 UTC · 2026-08-04 08:05 UTC · 2026-08-04 08:10 UTC0/5 starts at minute zero and repeats every five; 8-17 holds it between 08:00 and 17:55 UTC. Spelled-out day names dodge the numbering trap — MON-FRI reads the same in every dialect.
rate(5 minutes)canonical rate(5 minutes)
description Every 5 minutes
next runs 2026-08-04 00:05 UTC · 2026-08-04 00:10 UTC · 2026-08-04 00:15 UTCUnit and value agree in number — rate(5 minute) and rate(1 minutes) are both rejected. The interval clock starts at rule creation, so this preview starts it now.
cron(0 18 ? * 1-5 *)canonical cron(0 18 ? * 1-5 *)
description At 18:00, Sunday through Thursday
next runs 2026-08-04 18:00 UTC · 2026-08-05 18:00 UTC · 2026-08-06 18:00 UTC · 2026-08-09 18:00 UTC · 2026-08-10 18:00 UTC
warning On AWS, day-of-week 1-5 means Sunday through Thursday (1 = Sunday). For Monday through Friday write MON-FRI or 2-6.Valid — and probably wrong. On AWS, 1-5 selects Sunday through Thursday: Friday 2026-08-07 is missing above while Sunday 2026-08-09 appears. Weekdays here are MON-FRI or 2-6.
Every example on this page is executed against the same engine that powers the tool, on every build.
Gotchas worth knowing
1-5 is not Monday to Friday here
AWS counts day-of-week from 1 = Sunday to 7 = Saturday; classic crontab from 0 = Sunday. A numeric range therefore shifts by a day between systems — names are immune, so write MON-FRI.
Exactly one day field; the other gets ?
Day-of-month and day-of-week both * — or both set — is rejected. Schedule by one dimension; hand the other a literal ?.
Six fields — the year is not optional
A five-field crontab line is one short — the year (1970–2199) is mandatory here. * means any year.
Rules fire in UTC; Scheduler knows zones
Rule schedules evaluate in UTC+0 at one-minute precision. AWS labels them legacy in favor of EventBridge Scheduler — IANA zones, daylight saving — whose dialect this page does not cover.
L, W and # each have one home
Day-of-month takes L, LW and 3W (nearest weekday, same month); day-of-week takes 6L (last Friday) and 3#2 (second Tuesday). W in day-of-week, # in day-of-month, or a #6 instance — rejected.
One minute is the floor; rate() has no phase
rate(30 seconds) and a seconds field are refused — nothing beats one minute. The clock counts from rule creation, so rate(1 hour) lands on the hour only by chance; fixed times want cron().
The local column never moves a trigger
Instants are computed in UTC; the local preview is a reading aid. Across a daylight-saving shift the wall reading changes — the firing moment does not.
Common errors
AWS rejects expressions where day-of-month and day-of-week are both * — keep one and write ? in the other- Unlike classic cron, AWS refuses both day fields as *. Pick one; write ? in the other.
Six fields expected — minutes hours day-of-month month day-of-week year — but this body has 5- The classic five-field line stops at day-of-week; EventBridge wants a sixth, the year. Append * — or take the dialect chip.
A value of 1 takes the singular unit — AWS requires the singular: rate(1 minute)- A value of one takes minute, hour or day; larger values take the plural. Apply the quoted form verbatim.
field 6 (year): 2300 is out of range 1970–2199- Years run 1970 through 2199 — outside the window a schedule cannot exist. Use an in-range year, a span like 2026-2028, or *.
On AWS, day-of-week 1-5 means Sunday through Thursday (1 = Sunday). For Monday through Friday write MON-FRI or 2-6.- Not a rejection — the schedule runs, one day off from the usual intent. If weekdays were meant, MON-FRI (or 2-6) ends the warning.
Input is longer than 1,024 characters — the limit for this tool. Validate on AWS instead: aws events put-rule --name nightly-job --schedule-expression 'cron(0 0 * * ? *)'- Schedule expressions are short by nature; oversized input is declined whole rather than trimmed into a different schedule. put-rule runs AWS's own grammar server-side.
FAQ
Which time zone do EventBridge cron schedules use?
UTC+0, always — a rule's schedule expression has no time-zone parameter; console local times are display only. Jobs that follow local clocks belong on EventBridge Scheduler, which takes an IANA zone per schedule; the local column here reads over unchanged UTC instants.
Why does AWS reject my crontab expression?
Three gaps cover most cases: five fields where EventBridge wants six (the year), both day fields left as *, or a numeric weekday assuming 0 = Sunday. Paste the line above — the error names the rule and the position.
Is 1 Sunday or Monday in AWS cron?
Sunday. Day-of-week runs 1–7 as SUN–SAT, one off from crontab's 0–6. The offset is why an imported 1-5 silently drops Friday and gains Sunday — and why numeric ranges draw a warning here.
Keyboard shortcuts
- ⌘/Ctrl + Enter
- Re-run validation and the trigger preview now.
- ⌘/Ctrl + S
- Download the .txt report: expression, description, next ten UTC runs.
- ⌘/Ctrl + C
- With nothing selected, copy the canonical expression.
- ⌘/Ctrl + Shift + C
- Force-copy the canonical expression, selection or not.
- t
- Next theme (idle while typing in a field).
- ? or ⌘/Ctrl + /
- Open the shortcut help overlay.
- Esc
- Close the topmost overlay; focus returns to its opener.