AWS EventBridge Cron Builder
Build and validate AWS cron() and rate() schedule expressions for EventBridge rules, EventBridge Scheduler and Lambda. Get a plain-English explanation, the next run times in UTC and your local time, a Unix cron converter and ready-to-paste CLI, CloudFormation, Terraform and Serverless snippets.
Presets
Next runs
Use it
Unix cron → AWS
AWS → Unix cron
from the expression aboveThe six fields of an AWS cron expression
Amazon EventBridge (formerly CloudWatch Events), EventBridge Scheduler, and services built on them such as scheduled Lambda functions, ECS scheduled tasks and Glue triggers all use the same cron() syntax. It has six space-separated fields, and all six are required:
cron(Minutes Hours Day-of-month Month Day-of-week Year)
| | | | | |
| | | | | `-- 1970-2199
| | | | `-- 1-7 or SUN-SAT (1 = Sunday)
| | | `-- 1-12 or JAN-DEC
| | `-- 1-31
| `-- 0-23
`-- 0-59
*every value,,a list (MON,WED,FRI),-a range (9-17),/an increment (0/15means 0, 15, 30, 45).?means "no specific value". It is only allowed in Day-of-month and Day-of-week.Lmeans "last". In Day-of-month,Lis the last day of the month. In Day-of-week,6Lis the last Friday of the month.Wmeans "nearest weekday" and is only allowed in Day-of-month.15Wruns on the weekday closest to the 15th, staying inside the month.LWis the last weekday of the month.#picks the nth weekday of the month and is only allowed in Day-of-week.2#1is the first Monday and6#3is the third Friday.
The ? rule
You can't restrict Day-of-month and Day-of-week in the same expression. Exactly one of them must be ?. If you want "every day", put * in one field and ? in the other: cron(0 12 * * ? *) or cron(0 12 ? * * *). AWS rejects cron(0 12 * * * *) with a validation error, and it also rejects an expression with ? in both fields.
This is stricter than Unix cron, where both fields can be set and the job runs when either one matches. To get that behaviour on AWS, create two rules: one that uses Day-of-month and one that uses Day-of-week. The converter above does this for you.
Differences from Unix cron (the usual confusions)
- Six fields, not five. AWS adds a Year field at the end. Pasting
0 9 * * 1-5straight from a crontab fails. - Day-of-week starts at 1 = Sunday. In Unix cron, 0 (or 7) is Sunday and 1 is Monday. In AWS, 1 is Sunday and 7 is Saturday, and 0 is invalid. So Unix
1-5(Monday to Friday) becomes AWS2-6. Names likeMON-FRImean the same thing on both and avoid the mistake. - One day field must be
?. See above. - Always UTC. EventBridge rules have no time zone setting.
cron(0 9 * * ? *)runs at 09:00 UTC, which is 10:00 or 11:00 in Central Europe and 04:00 or 05:00 in New York depending on daylight saving time. - No seconds field. Quartz and Spring cron start with seconds. AWS doesn't, and the smallest interval is one minute.
- Extra characters.
L,Wand#exist in AWS (and Quartz) but not in standard Unix cron. - No macros.
@daily,@hourlyand@rebootaren't accepted. Userate(1 day)or a full cron expression.
Time zones and EventBridge Scheduler
Classic EventBridge rules (aws events put-rule, AWS::Events::Rule, aws_cloudwatch_event_rule) always evaluate cron expressions in UTC. If you need a job at 09:00 local time all year round, those rules can't follow daylight saving changes for you.
EventBridge Scheduler (aws scheduler create-schedule, AWS::Scheduler::Schedule, aws_scheduler_schedule) uses the same expression syntax but accepts a ScheduleExpressionTimezone such as Europe/London or America/New_York, and it handles DST transitions. It also supports one-time at(2026-12-31T23:00:00) schedules and flexible time windows. For new workloads AWS recommends Scheduler over scheduled rules. The run times on this page assume UTC; if you set a time zone on a Scheduler schedule, read the times as that zone's wall-clock time.
rate() vs cron()
rate(value unit) runs at a fixed interval: rate(5 minutes), rate(1 hour), rate(7 days). The unit is minute, minutes, hour, hours, day or days. Use the singular when the value is 1 and the plural otherwise, so rate(1 minutes) and rate(5 minute) are both errors.
A rate starts counting from when the rule or schedule is created, not from the top of the hour. rate(1 hour) created at 10:17 fires at 11:17, 12:17 and so on. If you need fixed wall-clock times, such as "on the hour" or "at midnight", use cron(). The next runs shown for a rate expression are counted from now.
Examples
| Expression | Runs |
|---|---|
cron(0/5 * * * ? *) | Every 5 minutes |
cron(0 * * * ? *) | Every hour, on the hour |
cron(0 0 * * ? *) | Every day at midnight UTC |
cron(0 9 ? * MON-FRI *) | Weekdays at 09:00 UTC |
cron(0/15 9-17 ? * MON-FRI *) | Every 15 minutes during office hours, Monday to Friday |
cron(0 8 1 * ? *) | 08:00 on the 1st of every month |
cron(0 18 L * ? *) | 18:00 on the last day of every month |
cron(0 9 LW * ? *) | 09:00 on the last weekday of every month |
cron(0 10 ? * 2#1 *) | 10:00 on the first Monday of every month |
cron(0 17 ? * 6L *) | 17:00 on the last Friday of every month |
cron(0 0 1 1/3 ? *) | Midnight on the first day of each quarter |
cron(30 23 31 12 ? 2026) | Once, at 23:30 UTC on 31 December 2026 |
rate(10 minutes) | Every 10 minutes from creation time |
Common validation errors
- "Parameter ScheduleExpression is not valid": usually five fields instead of six,
*in both day fields, or a Day-of-week of 0. - The rule never fires: check that the Year field isn't in the past, that a day such as 31 exists in the months you selected, and that the target's resource policy allows EventBridge to invoke it.
- It fires at the wrong hour: the expression is in UTC. Convert your local time, or switch to EventBridge Scheduler with a time zone.