Cron tools › Platforms
GitHub Actions cron schedule
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
- 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".
- Check the messages. GitHub accepts no
@daily-style shorthands and runs nothing more often than every 5 minutes. - If your GitHub supports it, copy Option 1: the local cron plus
timezone:. GitHub then follows daylight saving time for you. - 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
gatestep drops the run whose local hour is wrong. - 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:
| Period | Local | UTC offset | UTC cron |
|---|---|---|---|
| Daylight saving time (EDT) | 09:30 | UTC−04:00 | 30 13 * * 1-5 |
| Standard time (EST) | 09:30 | UTC−05:00 | 30 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
- Five fields; day-of-week is 0-6 or SUN-SAT, month 1-12 or JAN-DEC.
20/15in the minute field means 20, 35 and 50. - No
@yearly,@monthly,@weekly,@daily,@hourlyor@reboot. - The shortest interval is once every 5 minutes.
- Runs can be delayed at times of high load, especially at the start of every hour, and queued jobs may be dropped. An off-minute such as
17is a safer pick than0. - Scheduled workflows run on the latest commit of the default branch.
- In public repositories, scheduled workflows are disabled after 60 days without repository activity.
github.event.scheduleholds the cron string that triggered the run.
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.