EventBridge vs Linux cron: the four differences that bite you
You have a working Linux cron expression. You paste it into EventBridge. It's either rejected outright, or worse, accepted but firing at unexpected times. Either way, it's one of exactly four differences. Learn these and you'll stop losing time to this:
1. Field count
Linux cron has 5 fields: minute, hour, day-of-month, month, day-of-week. EventBridge has 6 —
the same five, plus a mandatory year field at the end. Almost everyone's first
mistake. If in doubt, use * for year.
2. Day-of-week numbering
Linux: 0 or 7 = Sunday, 1 = Monday, ..., 6 = Saturday.
EventBridge: 1 = Sunday, 2 = Monday, ..., 7 = Saturday. Every day
is shifted by one. The classic symptom: your weekday-only job (1-5 in Linux) is
firing Sun–Thu when you meant Mon–Fri. In EventBridge, Mon–Fri is 2-6.
3. The ? wildcard is required
EventBridge demands ? in exactly one of day-of-month or day-of-week — you
can't leave both as *, and you can't put specific values in both simultaneously.
The reason: most cron implementations historically treated "day-of-month * AND day-of-week *"
as ambiguous. EventBridge forces you to pick. If you care about the day of the month (e.g.,
the 1st of each month), use ? for day-of-week. If you care about the day of the
week (every Monday), use ? for day-of-month.
4. UTC only
EventBridge Rules schedules run in UTC. There's no TZ= prefix, no option to
specify a zone. If you need "9 AM Eastern on weekdays", you must compute the UTC equivalent
— and remember that DST will shift it twice a year. If this matters, use EventBridge
Scheduler (the newer service) instead of EventBridge Rules; it supports time zones
natively.
Common EventBridge cron mistakes
- Forgetting the year field. AWS returns a cryptic validation error that doesn't point to the missing field. This tool adds it for you.
- Using Linux day-of-week numbering.
* * * * 1-5 *in EventBridge fires Sun–Thu, not Mon–Fri. Silent wrong behavior. - Putting
*in both day fields. Rejected at rule-creation time with a message that's hard to parse if you don't know about the?rule. - Assuming local time. You set a rule for "3:00" expecting it to run at 3 AM local; it runs at 3 AM UTC, and DST makes it weirder.
- Using
stepvalues EventBridge doesn't support. Some exotic Linux cron features aren't supported in EventBridge; stick to the common subset.
Mapping examples
| Description | Linux cron | EventBridge cron |
|---|---|---|
| Every minute | * * * * * | * * * * ? * |
| Every hour on the hour | 0 * * * * | 0 * * * ? * |
| Daily at 02:30 | 30 2 * * * | 30 2 * * ? * |
| Weekdays at 09:00 | 0 9 * * 1-5 | 0 9 ? * 2-6 * |
| Every Sunday at midnight | 0 0 * * 0 | 0 0 ? * 1 * |
| 1st of every month at 00:00 | 0 0 1 * * | 0 0 1 * ? * |
| Every 15 minutes | */15 * * * * | 0/15 * * * ? * |
Frequently asked questions
Why doesn't EventBridge support seconds?
Minimum granularity is 1 minute. If you need sub-minute schedules, you're probably looking for Step Functions wait states or a long-running worker, not a cron-style scheduler.
What's the difference between EventBridge Rules and EventBridge Scheduler?
Rules is the older, cheaper, simpler service tied to EventBridge event buses. Scheduler is newer, supports time zones, handles one-time schedules, and scales to many thousands of schedules per account without hitting rule limits. For new work, prefer Scheduler unless you have a specific reason to stay on Rules.
Can I use Linux cron expressions directly with EventBridge Scheduler?
No — EventBridge Scheduler uses the same 6-field cron syntax as EventBridge Rules. The difference is Scheduler supports time zones and one-time schedules; the cron grammar is the same.
Why are next-run times shown in UTC?
Because that's how EventBridge executes them. We also display your local time alongside each UTC timestamp for sanity-check. If your infrastructure assumes UTC everywhere (it should), the UTC times are authoritative.
Does EventBridge support the L (last day of month) modifier?
Yes for day-of-month (e.g., L for the last day). This tool currently doesn't
translate L — stick to numeric day fields, or write the EventBridge
expression directly for those edge cases.