Free tool
Convert a server-local cron schedule into UTC, then translate it for EventBridge, Quartz, Spring, GitHub Actions, Kubernetes, or Vercel.
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
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.