Back to blog

Clocks Go Back on 25 October. Which of Your Jobs Run Twice?

Europe falls back on 25 October and the US on 1 November. What cron, systemd, Kubernetes, GitHub Actions and EventBridge do with the hour that happens twice.

CronGuard TeamCron Job Monitoring Experts
6 min read
A dark terminal screen showing system information for an Ubuntu 26.04 virtual machine in red and cream text, including kernel, uptime, memory and disk usage, next to red ASCII art

The hour that happens twice

At 01:00 UTC on Sunday 25 October 2026, most of Europe turns its clocks back. In Amsterdam 03:00 CEST becomes 02:00 CET, and the hour from 02:00 to 02:59 plays twice. A job set for 02:30 local now has two candidates: 00:30 UTC and 01:30 UTC. The US follows on 1 November, repeating 01:00 to 01:59.

Which one fires, and how often, depends on the scheduler.

It is also the first autumn for GitHub Actions schedules with a time zone. The timezone: field shipped in the late March 2026 Actions changelog, and the docs only describe spring.

What each scheduler does with the repeated hour

cronie: two man pages, two answers

cronie, the cron on RHEL, Fedora and Arch, contradicts itself. crontab(5) says times that occur more than once "will cause matching jobs to be run twice". cron(8) says that after a backward adjustment "running the same job twice is avoided" for fixed-time jobs.

cron.c settles it, mostly. A backward jump under three hours runs wildcard jobs only, but the jump is measured in the daemon's own zone. Put the host on UTC and set CRON_TZ=Europe/Amsterdam in the crontab, and the daemon sees no jump at all. It checks every minute in the job's zone, meets 02:30 twice, and crontab(5) is right.

Debian and Ubuntu cron

Debian runs a patched Vixie cron with the same three-hour rule. Its cron(8) says jobs in the repeated time "will not be re-run". That only covers jobs at a particular time. Anything with * in the hour or minute field, or @hourly, follows the new clock, so a */15 job fires in both passes of the hour. Usually that's what you want.

systemd timers

systemd.time(7) takes an IANA zone at the end of OnCalendar= and says nothing about DST. So we asked systemd-analyze on Debian 12, systemd 252:

systemd-analyze calendar --iterations=3 \
  --base-time='2026-10-24 12:00 UTC' \
  '*-*-* 02:30:00 Europe/Amsterdam'
    Next elapse: Sun 2026-10-25 00:30:00 UTC
       Iter. #2: Mon 2026-10-26 01:30:00 UTC
       Iter. #3: Tue 2026-10-27 01:30:00 UTC

One run, at the first 02:30. In spring the 29 March run was skipped outright. That is one version. Run the command on yours.

Kubernetes CronJobs

.spec.timeZone has been GA since Kubernetes 1.27, and the CronJob docs never mention daylight saving. The controller uses robfig/cron/v3, whose docs warn that "jobs scheduled during daylight-savings leap-ahead transitions will not be run!" About falling back they say nothing. Maintainers of the netresearch/go-cron fork opened an issue in November 2025 because nobody could say whether a repeated-hour job runs once or twice. Assume twice until staging proves otherwise.

GitHub Actions

GitHub documents spring only: with a DST-observing timezone, a schedule in the skipped hour will "advance to the next valid time", so 02:30 becomes 03:00. The repeated hour isn't mentioned. A 01:30 America/New_York workflow on 1 November is anyone's guess.

AWS EventBridge Scheduler

EventBridge Scheduler is the only one here that writes both cases down. A spring invocation on a non-existent time is skipped. In autumn "your schedule runs only once and does not repeat its invocation", at the first occurrence. rate(1 days) means 24 hours flat.

Find your exposed jobs before Sunday

Look at anything pinned between 01:00 and 02:59 local time. Start with host crontabs:

awk '!/^[[:space:]]*#/ && NF >= 6 && $2 ~ /(^|,)0?[12](,|$)/ { print FILENAME": "$0 }' \
  /etc/crontab /etc/cron.d/* /var/spool/cron/crontabs/* /var/spool/cron/* 2>/dev/null
grep -rn 'CRON_TZ' /etc/crontab /etc/cron.d /var/spool/cron 2>/dev/null

The CRON_TZ check matters most on UTC hosts, where cronie's guard doesn't reach. For timers, run each zoned OnCalendar= through the systemd-analyze check above. For Kubernetes and GitHub:

kubectl get cronjobs -A \
  -o custom-columns=NS:.metadata.namespace,NAME:.metadata.name,SCHEDULE:.spec.schedule,TZ:.spec.timeZone
grep -rn -A1 'cron:' .github/workflows/ | grep -B1 'timezone:'

Make a second run harmless

Move the job or schedule it in UTC

The cheapest fix is moving it. A nightly job at 04:00 local never meets the repeated hour in Europe or the US. If it doesn't need local business hours, schedule it in UTC.

Key the work on the local date

When the time is fixed for a reason, make the job refuse to do the same day twice. On one host a stamp file does it:

#!/bin/bash
set -euo pipefail
stamp="/var/lib/nightly-report/$(TZ=Europe/Amsterdam date +%F).done"
[ -e "$stamp" ] && exit 0

/usr/local/bin/build-nightly-report
touch "$stamp"

Across several hosts you need a shared store, like a unique row per day in the database the job already writes to.

Watch the run, not the clock

DST trips up monitoring too. A daily 02:30 Amsterdam job runs at 00:30 UTC on 25 October and 01:30 UTC the next day: 25 hours apart. A check-in monitor expecting 24 hours with a 30-minute grace pages someone for nothing. Use one that follows the cron expression in the job's zone. And a dead man's switch only alerts on missing runs. If a duplicate costs money, log a run ID with each check-in and count them on Monday.

Frequently asked questions about DST and the repeated hour

When do clocks go back in 2026? Most of Europe falls back on Sunday 25 October at 01:00 UTC, the United States on Sunday 1 November. Amsterdam repeats 02:00 to 02:59, New York repeats 01:00 to 01:59.

Will a cron job at 02:30 run twice when the clocks go back? On cronie and Debian cron with the host in a DST zone, a fixed-time job is not repeated, because cron(8) skips the repeated time for jobs at a particular hour. Cronie's own crontab(5) page still says such jobs run twice, and that is what to expect on a UTC host that sets CRON_TZ to a local zone.

How do systemd timers handle the repeated hour? The documentation does not say. Tested with systemd-analyze on systemd 252, a daily 02:30 Europe/Amsterdam timer fired once, at the first 02:30.

Do GitHub Actions scheduled workflows with a timezone run twice in autumn? GitHub only documents spring, where a schedule in the skipped hour moves to the next valid time. Nothing is written about the repeated hour, so test any workflow scheduled in that hour rather than assuming it runs once.

Why does my daily job monitor fire a false alarm after the clock change? A daily job pinned to local time runs 25 hours apart across the autumn change. A monitor expecting a fixed 24 hours with a short grace flags that as a missed run. Use one that follows the cron schedule in the job's zone.

Further reading


Conclusion: Nobody should have to read a scheduler's source to know whether a backup runs twice on a Sunday in October, but for cronie and Kubernetes that is where the answer lives. Don't count on getting it right. Get the jobs out of the 01:00 to 02:59 window this week, and the ones that have to stay there should shrug off a second run.

Sources: crontab(5) manual, cronie cron(8) manual, cronie cron.c, Debian cron(8) manual, systemd.time(7), Kubernetes CronJob documentation, robfig/cron documentation, netresearch/go-cron issue 70, GitHub Actions: Late March 2026 updates, GitHub Actions schedule event documentation, EventBridge Scheduler schedule types.

Share

Related posts

Rows of patch panels in a server rack with looped black network cables, lit in deep green and half hidden behind the dark edge of a neighbouring cabinet
ReliabilityGang-Scheduled CronJobs in Kubernetes 1.37: The Run That Never Starts
A fiber-optic patch panel in a rack, green connectors and yellow cables looping across rows of numbered ports
ReliabilityWhen a Scheduled Job Runs Long: Overlap, Skip, or Replace
A person at a desk in a dark room, lit by two monitors filled with lines of code, looking toward the camera, in black and white
ReliabilityThe Kubernetes CronJob Deadlock That Stops Your Schedule For Good

Set up your first monitor.
It'll take 30 seconds.