Free tool
Build a GitHub Actions schedule, validate it against GitHub's UTC-only subset of Unix cron, and see the next runs in any timezone. Includes the two-cron pattern that keeps a 9am London job firing through both BST and GMT.
on:
schedule:
- cron: '*/15 * * * *'| # | UTC | UTC | Notes |
|---|---|---|---|
| 1 | Thu 2026-06-18 22:15 UTC | Thu 2026-06-18 22:15 Z | Thu |
| 2 | Thu 2026-06-18 22:30 UTC | Thu 2026-06-18 22:30 Z | Thu |
| 3 | Thu 2026-06-18 22:45 UTC | Thu 2026-06-18 22:45 Z | Thu |
| 4 | Thu 2026-06-18 23:00 UTC | Thu 2026-06-18 23:00 Z | Thu |
| 5 | Thu 2026-06-18 23:15 UTC | Thu 2026-06-18 23:15 Z | Thu |
| 6 | Thu 2026-06-18 23:30 UTC | Thu 2026-06-18 23:30 Z | Thu |
| 7 | Thu 2026-06-18 23:45 UTC | Thu 2026-06-18 23:45 Z | Thu |
| 8 | Fri 2026-06-19 00:00 UTC | Fri 2026-06-19 00:00 Z | Fri |
| 9 | Fri 2026-06-19 00:15 UTC | Fri 2026-06-19 00:15 Z | Fri |
| 10 | Fri 2026-06-19 00:30 UTC | Fri 2026-06-19 00:30 Z | Fri |
| 11 | Fri 2026-06-19 00:45 UTC | Fri 2026-06-19 00:45 Z | Fri |
| 12 | Fri 2026-06-19 01:00 UTC | Fri 2026-06-19 01:00 Z | Fri |
| 13 | Fri 2026-06-19 01:15 UTC | Fri 2026-06-19 01:15 Z | Fri |
| 14 | Fri 2026-06-19 01:30 UTC | Fri 2026-06-19 01:30 Z | Fri |
| 15 | Fri 2026-06-19 01:45 UTC | Fri 2026-06-19 01:45 Z | Fri |
| 16 | Fri 2026-06-19 02:00 UTC | Fri 2026-06-19 02:00 Z | Fri |
| 17 | Fri 2026-06-19 02:15 UTC | Fri 2026-06-19 02:15 Z | Fri |
| 18 | Fri 2026-06-19 02:30 UTC | Fri 2026-06-19 02:30 Z | Fri |
| 19 | Fri 2026-06-19 02:45 UTC | Fri 2026-06-19 02:45 Z | Fri |
| 20 | Fri 2026-06-19 03:00 UTC | Fri 2026-06-19 03:00 Z | Fri |
| 21 | Fri 2026-06-19 03:15 UTC | Fri 2026-06-19 03:15 Z | Fri |
| 22 | Fri 2026-06-19 03:30 UTC | Fri 2026-06-19 03:30 Z | Fri |
| 23 | Fri 2026-06-19 03:45 UTC | Fri 2026-06-19 03:45 Z | Fri |
| 24 | Fri 2026-06-19 04:00 UTC | Fri 2026-06-19 04:00 Z | Fri |
| 25 | Fri 2026-06-19 04:15 UTC | Fri 2026-06-19 04:15 Z | Fri |
| 26 | Fri 2026-06-19 04:30 UTC | Fri 2026-06-19 04:30 Z | Fri |
| 27 | Fri 2026-06-19 04:45 UTC | Fri 2026-06-19 04:45 Z | Fri |
| 28 | Fri 2026-06-19 05:00 UTC | Fri 2026-06-19 05:00 Z | Fri |
| 29 | Fri 2026-06-19 05:15 UTC | Fri 2026-06-19 05:15 Z | Fri |
| 30 | Fri 2026-06-19 05:30 UTC | Fri 2026-06-19 05:30 Z | Fri |
| 31 | Fri 2026-06-19 05:45 UTC | Fri 2026-06-19 05:45 Z | Fri |
| 32 | Fri 2026-06-19 06:00 UTC | Fri 2026-06-19 06:00 Z | Fri |
| 33 | Fri 2026-06-19 06:15 UTC | Fri 2026-06-19 06:15 Z | Fri |
| 34 | Fri 2026-06-19 06:30 UTC | Fri 2026-06-19 06:30 Z | Fri |
| 35 | Fri 2026-06-19 06:45 UTC | Fri 2026-06-19 06:45 Z | Fri |
| 36 | Fri 2026-06-19 07:00 UTC | Fri 2026-06-19 07:00 Z | Fri |
| 37 | Fri 2026-06-19 07:15 UTC | Fri 2026-06-19 07:15 Z | Fri |
| 38 | Fri 2026-06-19 07:30 UTC | Fri 2026-06-19 07:30 Z | Fri |
| 39 | Fri 2026-06-19 07:45 UTC | Fri 2026-06-19 07:45 Z | Fri |
| 40 | Fri 2026-06-19 08:00 UTC | Fri 2026-06-19 08:00 Z | Fri |
| 41 | Fri 2026-06-19 08:15 UTC | Fri 2026-06-19 08:15 Z | Fri |
| 42 | Fri 2026-06-19 08:30 UTC | Fri 2026-06-19 08:30 Z | Fri |
| 43 | Fri 2026-06-19 08:45 UTC | Fri 2026-06-19 08:45 Z | Fri |
| 44 | Fri 2026-06-19 09:00 UTC | Fri 2026-06-19 09:00 Z | Fri |
| 45 | Fri 2026-06-19 09:15 UTC | Fri 2026-06-19 09:15 Z | Fri |
| 46 | Fri 2026-06-19 09:30 UTC | Fri 2026-06-19 09:30 Z | Fri |
| 47 | Fri 2026-06-19 09:45 UTC | Fri 2026-06-19 09:45 Z | Fri |
| 48 | Fri 2026-06-19 10:00 UTC | Fri 2026-06-19 10:00 Z | Fri |
| 49 | Fri 2026-06-19 10:15 UTC | Fri 2026-06-19 10:15 Z | Fri |
| 50 | Fri 2026-06-19 10:30 UTC | Fri 2026-06-19 10:30 Z | Fri |
On paper, GitHub Actions uses the same 5-field Unix cron you have used for years. In practice, three quirks turn a five-second config change into an outage. First, theon.schedule.cron trigger has no timezone: field. Every expression runs in UTC, full stop, which is the single biggest reason teams in London ship "every weekday at 9am" workflows that fire at 10am for half the year.
Second, GitHub silently raises any cadence under 5 minutes to */5. Write*/1 * * * * and you will not get an error, you will get a schedule that runs twelve times an hour instead of sixty. The picker above flags this for you.
Third, scheduled workflows pause themselves on inactive repos. After 60 days with no commits, no PRs, no manual interaction, GitHub disables the schedule until somebody does something. If you run a nightly mirror or a weekly digest off a repo that nobody touches, the job goes dark and you do not get an email. The cure is to land a noop commit (or trigger a manual run) every couple of months.
Because GitHub Actions has no timezone field, every "9am London" workflow needs to shift its UTC hour twice a year. The fix is two cron lines and a comment, not one cron and a hope.
London during GMT (winter) is UTC+0, so 9am London is 9am UTC. London during BST (summer) is UTC+1, so 9am London is 8am UTC. Split your schedule by month: one cron covers the winter months at 0 9, the other covers the summer months at0 8. The picker above generates the snippet for you with the right comments.
There is a small honesty tax. DST switches on the last Sunday of March and the last Sunday of October, not on month boundaries. For the two or three weekdays between the month boundary and the actual DST switch, your job will fire an hour off. If precise wall-clock timing matters, run the workflow through a self-hosted runner withTZ=Europe/London set, or use the time zone converter to double-check the days that straddle the cliff.
Every workflow on GitHub that schedules 0 * * * * wakes up at the same instant. So does every */5 * * * *, every 0 0 * * *, every round number. GitHub adds jitter to spread the load, but during peak hours the five-to-twenty minute lag is real and undocumented.
If your job needs to start promptly, do not pick the round minute. 3 * * * * runs once an hour at minute 3 and lands almost on time, because almost nobody else picked it. 0 * * * * shares its slot with everyone in the world who took the obvious answer.