ClockOrbit

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.

Winter (standard time)

London local

0 9 * * 1-5

UTC equivalent

0 9 * * 1-5

Paste into AWS EventBridge

0 9 ? * 2-6 *
Summer (DST)

London local

0 9 * * 1-5

UTC equivalent

0 8 * * 1-5

Paste 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:

DialectFieldsSecondsYear? placeholderL, W, #Sunday is
Unix5NoNoNoNo0 or 7
GitHub Actions5NoNoNoNo0 or 7
Kubernetes5NoNoNoNo0 or 7
Vercel5NoNoNoNo0 or 7
Quartz6 or 7Yes, firstOptional, lastYesYes1
Spring6Yes, firstNoYesNo1
AWS EventBridge6NoYes, lastRequiredYes1

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

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.