cronkit.org
Cron expressions, explained and converted — in your browser

Cron tools › Platforms

GitHub Actions cron schedule

on.schedule · timezone: key or UTC · DST handled

Say when the workflow should run in your own time zone. You get the workflow YAML with GitHub's timezone: key, and the UTC-only version for runners and servers without it: one cron line per half of the year, plus a guard step so only the right one does the work.

Option 1 · the timezone: key

GitHub added timezone: next to cron: on 2026-03-19. In a skipped DST hour a run advances (2:30 AM becomes 3:00 AM).

Option 2 · UTC-only cron

Next runs (with the timezone: key)

Try one

How to schedule a GitHub Actions workflow in local time

  1. Set the Time, the Days and your Time zone. The cron line below is written for you; edit it directly for schedules such as "every 15 minutes" or "the 1st of the month".
  2. Check the messages. GitHub accepts no @daily-style shorthands and runs nothing more often than every 5 minutes.
  3. If your GitHub supports it, copy Option 1: the local cron plus timezone:. GitHub then follows daylight saving time for you.
  4. Otherwise use Option 2. The table shows the UTC cron for standard time and for daylight saving time, each checked against the local schedule. The workflow schedules both and a gate step drops the run whose local hour is wrong.
  5. Commit the file under .github/workflows/ on the default branch: scheduled workflows run from there.

Why the UTC hour changes twice a year

Without timezone:, GitHub reads the cron in UTC. New York is UTC−05:00 in winter and UTC−04:00 in summer, so "09:30 on weekdays" is two different UTC schedules:

PeriodLocalUTC offsetUTC cron
Daylight saving time (EDT)09:30UTC−04:0030 13 * * 1-5
Standard time (EST)09:30UTC−05:0030 14 * * 1-5

A local time late in the evening crosses midnight in UTC, and then the weekday moves too: 22:00 in New York on Monday–Friday is 0 3 * * 2-6 in winter. The tool shifts the day-of-week for you, and refuses when a day-of-month would have to move across a month boundary (plain cron has no "last day of the previous month"). The guard step is plain shell:

- id: gate
  run: '[ "$(TZ=America/New_York date +%H)" = "09" ] && echo "go=true" >> "$GITHUB_OUTPUT" || true'
- name: Run the job
  if: github.event_name == 'workflow_dispatch' || steps.gate.outputs.go == 'true'
  run: ./do-the-work.sh

The tool simulates the guarded workflow across the next year's clock changes and says when it would skip or double a run.

What GitHub documents about scheduled workflows

The cron parser explains any line on its own, and the time zone converter rewrites schedules between arbitrary zones.

FAQ

Why did my scheduled workflow start late, or not at all?

GitHub documents that scheduled runs can be delayed at times of high load, especially at the start of every hour, and that queued jobs may be dropped. Move the minute away from 0 (for example to 17) and do not rely on minute-exact timing.

Why did my schedule stop running?

In a public repository, scheduled workflows are disabled after 60 days without repository activity. Also check that the workflow file is on the default branch: schedules run on its latest commit.

Can I use @daily or run every minute?

No. GitHub does not accept the @ shorthands, so write 0 0 * * *, and the shortest interval is every 5 minutes. */5 * * * * is the floor.

How can a step tell which cron line fired?

Read github.event.schedule: it holds the cron string of the schedule that triggered the run. The guard in option 2 checks the local hour instead, which also works for manual runs through workflow_dispatch.

Does the timezone: key work on GitHub Enterprise Server?

The key was added on 2026-03-19. If your GitHub Enterprise Server version rejects it, use option 2: the UTC lines with the guard step.