Free tool
Cron timezone translator
Convert a local-time cron schedule into UTC expressions for your scheduler. Daylight saving changes can require separate expressions for standard and daylight time.
London local
0 9 * * 1-5UTC equivalent
0 9 * * 1-5Paste into AWS EventBridge
0 9 ? * 2-6 *London local
0 9 * * 1-5UTC equivalent
0 8 * * 1-5Paste into AWS EventBridge
0 8 ? * 2-6 *Translation warnings
- Day-of-week numbering shifted: Unix 0=Sun -> EventBridge 1=Sun
A worked example: 09:00 London weekdays on EventBridge
Take the default schedule, 0 9 * * 1-5, meaning 09:00 Monday to Friday in Europe/London. In winter London sits at UTC+00:00, so the UTC cron keeps hour 9. During British Summer Time the offset is UTC+01:00, so 09:00 local becomes 08:00 UTC. The translator then rewrites each UTC expression for the target dialect. For EventBridge, day-of-week 1-5 becomes 2-6 because EventBridge numbers Sunday as 1, the unused day-of-month slot becomes the required question mark, and a trailing year field is appended: 0 9 ? * 2-6 * for winter and 0 8 ? * 2-6 * for summer.
Zones without seasonal changes collapse to a single card. Asia/Kolkata stays at UTC+05:30 all year, so 09:00 local is always 03:30 UTC and the same weekday schedule translates once as 30 3 * * 1-5. The half-hour lands in the minute field, which is why the tool needs a concrete minute value rather than a wildcard.
Dialect cheat sheet
The seven dialects this tool reads and writes differ in field count, weekday numbering, and which extensions they accept:
| Dialect | Fields | Seconds | Year | ? placeholder | L, W, # | Sunday is |
|---|---|---|---|---|---|---|
| Unix | 5 | No | No | No | No | 0 or 7 |
| GitHub Actions | 5 | No | No | No | No | 0 or 7 |
| Kubernetes | 5 | No | No | No | No | 0 or 7 |
| Vercel | 5 | No | No | No | No | 0 or 7 |
| Quartz | 6 or 7 | Yes, first | Optional, last | Yes | Yes | 1 |
| Spring | 6 | Yes, first | No | Yes | No | 1 |
| AWS EventBridge | 6 | No | Yes, last | Required | Yes | 1 |
Moving toward a smaller dialect loses information: a Quartz seconds value or an L/W/# extension has no Unix equivalent, so the translator substitutes a wildcard and reports exactly what changed in the warnings panel.
How the translator computes the split
The tool samples the source zone at one mid-January instant and one mid-July instant using the IANA time zone rules built into your browser, which covers daylight saving seasons in both hemispheres. Each distinct offset it finds is subtracted from the local schedule, minutes first, carrying into the hour and wrapping through midnight where needed. If the two samples agree, the zone is treated as fixed-offset and a single expression comes out.
Why EventBridge bites you on DST
EventBridge cron runs in UTC. If your source schedule is "9 a.m. London", that means 09:00 UTC in winter and 08:00 UTC during British Summer Time. A single UTC cron cannot represent both wall-clock seasons.
The two-cron solution for DST-blind schedulers
For time zones that observe daylight saving time, create one cron for standard time and one cron for daylight time. Keep the same local intent, split the UTC hour, and disable the inactive rule around the DST boundary if your scheduler cannot express date ranges.
Pitfalls to check before you paste
- Transition days themselves: a spring-forward gap can silently skip a run and a fall-back overlap can fire the same schedule twice on many systems. Preview the days around each change date rather than trusting the pattern.
- Midnight wrap: subtracting a large eastern offset can push the hour into the previous UTC day while day fields stay put. A 09:00 weekday schedule in Pacific/Auckland becomes 20:00 UTC, and Monday 20:00 UTC is already Tuesday morning in Auckland, so weekday intent needs a manual check.
- Mismatched reform dates: the United States switches on the second Sunday in March while EU countries switch on the last Sunday in March, so schedules spanning both regions drift by an hour for a few weeks every year.
- GitHub Actions cadence: scheduled workflows will not run more often than every 5 minutes, and busy periods can delay or drop runs entirely.
Cron and time zone questions
Why do I get two cron expressions for one schedule?
If the source time zone observes daylight saving time, its UTC offset changes twice a year. One UTC cron can only encode one offset, so the translator emits a standard-time version and a daylight-time version of the same local schedule.
Which schedulers accept a time zone directly?
Quartz can attach a time zone to a trigger, Kubernetes CronJobs accept a timeZone field on current versions, and AWS EventBridge Scheduler takes a schedule time zone. Classic EventBridge rules, GitHub Actions, and Vercel crons all evaluate in UTC, which is where this translator helps.
Why did the day-of-week numbers change in the output?
Unix-style dialects count Sunday as 0, while Quartz, Spring, and EventBridge count Sunday as 1. The translator renumbers the field automatically and raises a warning so you can double check the result.
Why does the tool require a fixed minute and hour?
Shifting a schedule by a UTC offset means adding or subtracting whole minutes. A wildcard or stepped minute field has no single value to shift, especially across 30 and 45 minute offsets, so the translator asks for concrete numbers.
What should I check when the converted hour crosses midnight?
The hour wraps around 24, but day-of-month and day-of-week fields keep their original values. A weekday morning in a zone far east of UTC lands on the previous UTC day, so confirm the day fields against the actual fire times before you paste the result into a scheduler.
Need to inspect the actual fire times? Open the cron visualizer and show the next 100 runs before shipping the schedule.