Skip to content

필사 모드: tzdata 2026c — Canada Stops Turning the Clocks, Morocco Returns to GMT

English
0%
정확도 0%
💡 왼쪽 원문을 읽으면서 오른쪽에 따라 써보세요. Tab 키로 힌트를 받을 수 있습니다.

Introduction — July 8, the Infrastructure Nobody Reads the Release Notes For

On July 8, 2026, the IANA Time Zone Database shipped tzdata 2026c, its third release of the year. This database is a bundle of text files holding the UTC offset, transition rules, and historical change record for every time zone on Earth, and it lives somewhere in your stack no matter what that stack is — the /usr/share/zoneinfo that glibc reads, the JDK's own bundled copy, the copy embedded in the Go standard library, and, via ICU, the browser, Node, and Android.

The reason this data gets updated is always the same: some government changed a law about time. This year's input was unusually heavy — two Canadian provinces (and soon, probably, a third territory) abolished seasonal clock changes, and Morocco decided to return to GMT after eight years. Along the way, something rare happened: tzdb, constrained by CLDR, deliberately carried a transition date that differs from the actual legal effective date.

This post traces what the year's three releases (2026a/2026b/2026c) actually changed, based on primary sources — the NEWS file and the zone data, and lays out what to check before the two fall deadlines. The general theory of time zones and timestamps was already covered in Timestamps and Time Zones, Done Right, so here we only look at what actually changed in 2026.

This Year's Three Releases, at a Glance

ReleaseDateKey change
2026a2026-03-01Retroactive fix to Moldova's historical data, right (leap-second) files dropped from the default install, TZif abbreviation space 50→256 bytes
2026b2026-04-22British Columbia permanent -07, zic overflow fix
2026c2026-07-08Alberta permanent -06, Morocco permanent +00 effective September 20, additional zic overflow fixes

tzdata isn't released on a schedule — it ships "whenever it's needed." Over the last three years (2023-2025) there were 4, 2, and 3 releases respectively, and this year is already on its third by July. And, as the NEWS file signals, the Northwest Territories situation means another release is likely needed soon.

Western Canada Stops Turning the Clocks

British Columbia (BC) went first. Per the BC government announcement (2026AG0013), the spring-forward transition on March 8, 2026 was the last clock change, and BC stays at -07 year-round after that. The legal wording is amusing — per Paul Eggert's summary as quoted in the tzdb comments, the new standard time, Pacific Time, "starts the following day (March 9, 00:00), 21 hours after the usual PST→PDT transition at 02:00 on March 8." In other words, the clock changes once, but the name change happens twice, 21 hours apart.

Alberta followed. The path there is interesting in a bureaucratic way — Section 3 of Bill 31 (the Red Tape Reduction Statutes Amendment Act, 2026) repealed the existing Daylight Saving Time Act and replaced it with the Official Time Act (Chapter O-5.7), locking in UTC-6 as standard time. It received royal assent on May 14, 2026, and took effect the same day it was made — June 18 — via Order in Council 204/2026. A companion order issued the same day, OiC 206/2026, gave this time the official name "Alberta Time," with a sunset clause expiring June 30, 2031 — meaning the name's validity is to be reviewed at that point. The tzdb comment dryly adds that this naming regulation affects neither time calculations nor TZDB data.

Alberta's year-round -06 isn't actually an unfamiliar time. It's the same time neighboring Saskatchewan has used for decades — tzdb's America/Regina has ended in -6:00 - CST for a long time. Alberta has simply joined that group.

The Northwest Territories (NWT) hasn't gotten there yet. The territory's premier has said they'll follow if Alberta does, and has in fact announced the abolition, but since the legal process hasn't finished, 2026c carries this only as a comment, not as data. Below the zone definition for America/Inuvik there's a comment like this:

Zone America/Inuvik	0	-	-00	1953 # Inuvik founded
			-8:00	NT_YK	P%sT	1979 Apr lastSun  2:00
			-7:00	NT_YK	M%sT	1980
			-7:00	Canada	M%sT
# Assuming Northwest Territories follows Alberta in abolishing seasonal time
# changes, replace the above line with something like:
#			-7:00	Canada	M%sT	2026 Nov  1  2:00
#			-6:00	-	CST

It's a TODO planted in the database in advance — once the law passes, they'll uncomment it and ship a release. That's why a 2026d is already being signaled.

Vancouver's New Abbreviation Is MST — the Trouble with Picking Abbreviations

The legal name of BC's new standard time is Pacific Time. The natural abbreviation would be PT, but that's where the trouble starts — tzdb and POSIX require time zone abbreviations to be alphanumeric (or signed) and between 3 and 6 characters, and PT is one character short. Eggert notes in the comments that he asked the BC government about an abbreviation but never got a reply. So the tzdb comments are left with a candidate-by-candidate critique, as is.

Candidatetzdb comment's assessment
MSTMost compatible with existing software and practice. Part of BC and the Yukon already use this abbreviation for -07
PDTMostly fine, but risks the misunderstanding that this is actually daylight time when it is standard time
PSTIntuitive, but more confusing, and risks breaking software that assumes PST means -08
-07Accurate on its own terms, but awkward next to neighboring regions
PacTIntuitive, but an unprecedented new abbreviation

The conclusion was MST. So the zone definition in 2026c looks like this:

Zone America/Vancouver	-8:12:28 -	LMT	1884
			-8:00	Vanc	P%sT	1987
			-8:00	Canada	P%sT	2026 Mar  9
			# Temporary hack; see above.
			-8:00	1:00	PDT	2026 Nov  1  2:00
			# End of temporary hack.
			-7:00	-	MST

Zone America/Edmonton	-7:33:52 -	LMT	1906 Sep
			-7:00	Edm	M%sT	1987
			-7:00	Canada	M%sT	2026 Jun 18
			# Temporary hack; see above.
			-7:00	1:00	MDT	2026 Nov  1  2:00
			# End of temporary hack.
			-6:00	-	CST

Vancouver becomes MST, Edmonton becomes CST. There is one practical lesson to take from this — time zone abbreviations are not identifiers. The assumption that PST means -08 and MST means Mountain Standard Time now breaks on Canada's west coast. If you have code that parses abbreviations or branches on them, now is the time to move to IANA zone IDs (America/Vancouver) instead.

Why tzdb Deliberately Carries a Wrong Transition Date — the CLDR 48.1 Constraint

You may have noticed something odd in the zone definitions above. BC's legal effective date is March 9 and Alberta's is June 18, yet the data has both transitioning at November 1, 02:00. That's the part marked "Temporary hack" in the comments.

The reason is spelled out in the tzdb comments. If you model this as "-07 standard time" starting March 9 the way the law says, CLDR 48.1 (2026-01-08) generates the display name for that span as "Pacific Standard Time" — an error exposed straight to the user, where the offset is -07 but the name reads as the -08 standard time. So tzdb, for now, left March 9 through November 1 as PDT (daylight time), the way it already was. In the comment's own words, this span is actually standard time, so strictly speaking this hack is wrong, but the UT offset is correct, and it sidesteps the CLDR constraint. The comment also notes the plan to remove the hack once November arrives, since there is no longer any reason to keep it.

The Alberta comment has one more layer — Alberta's hack is needed for CLDR 48.2 (2026-03-17) and below too, and since few platforms track minor CLDR releases, the practical effect of the two hacks is similar.

What makes this interesting is the direction it runs. The source of the data (tzdb) bent the data to fit the release cycle and constraints of its own consumer (CLDR/ICU). The actual supply chain for display names flows like this — tzdb defines offsets and transitions, CLDR attaches per-language display names, ICU bundles that into a library, and on top of that the browser's Intl API, Java, and Android show the time zone name. Per ICU's release notes, ICU 78.2 (2026-01-09) shipped with CLDR 48.1 + tzdata 2025c, ICU 78.3 (2026-03-17) shipped with CLDR 48.2 + tzdata 2026a, and ICU 79, slated for October, is planned to ship CLDR 49 + Unicode 18. Given that cycle, it is easy to see why the choice was to bend it temporarily until November.

Of course, it is not free. While the hack is alive, summer in Vancouver and Edmonton is legally standard time but isdst=1 in the data. Code that branches on tm_isdst, and UIs that display the abbreviation (PDT/MDT), will see a value that diverges from the law during that window. And at November 1, 02:00, there is a "ghost transition" where the offset does not change at all — PDT→MST, MDT→CST, a transition where only the name and isdst flip. If you have code that counts transition events or assumes an offset change happens at every transition, it is worth knowing that this kind of transition can exist.

Morocco Returns to +00 After Eight Years — and the Predictions Through 2087 Get Erased

Since October 2018, Morocco has run permanent +01 except for dropping to +00 during Ramadan, repeating two transitions every year. Per 2026c, that regime ends — the government repealed the 2018 decree with a June 25, 2026 decree (Decree No. 2.26.530), and Morocco returns to permanent +00 starting September 20, 2026, 02:00, with no DST. Western Sahara (Africa/El_Aaiun) goes along with it. The sources tzdb cites are the confirmed Morocco World News article and the official gazette (Bulletin Officiel No. 7521).

Zone Africa/Casablanca	-0:30:20 -	LMT	1913 Oct 26
			 0:00	Morocco	%z	1984 Mar 16
			 1:00	-	%z	1986
			 0:00	Morocco	%z	2018 Oct 28  3:00
			 1:00	Morocco	%z	2026 Sep 20  2:00
			 0:00	-	%z

This change came with an inconspicuous cleanup attached. Since Ramadan follows the Islamic calendar, its Gregorian-calendar dates shift every year, and tzdb had been carrying astronomically pre-calculated Ramadan transitions through the year 2087 as rules. The Morocco rules in 2026b's africa file ran 183 lines; in 2026c they are 57 — 126 lines of prediction rules for 2027 through 2087 were deleted wholesale. The simple fact that a time zone database was carrying 60 years of future predictions shows just how unusual a piece of data this is.

The remnants of these prediction rules make the symptoms of stale data strange, too. A system running 2026b or earlier past September 20 will compute Casablanca as +01, one hour fast. But the deleted old rules had a Ramadan prediction of "drops to +00 on 2027-02-07, then returns to +01 on 2027-03-14" — so for those five weeks it will accidentally be right again, before going wrong once more from mid-March. Bugs from stale tzdata can show up this intermittently.

The Quiet Default Changes in 2026a

If Canada and Morocco are the headline, March's 2026a was the release that changed defaults. Picking out just what matters to engineers, per the NEWS file:

  • The right (leap-second-aware) TZif files were dropped from the default install. This is an alternate file set for environments where the system clock counts leap seconds (non-POSIX-compliant), and since it is barely used by major distributions, it was excluded from the default. The old default can be restored with make REDO=posix_right, and if you genuinely have a leap-second-counting clock, make REDO=right_only is recommended. For where leap seconds themselves are headed, see No Leap Second in 2026 — and the Negative One No System Has Ever Run.
  • A new compile-time option, TZ_RUNTIME_LEAPS=0. It turns off runtime leap-second support — this complies with POSIX and reduces attack surface and cost, but gives up the leap-second feature of RFC 9636 (the TZif format standard).
  • The TZif abbreviation space grew from 50 bytes to 256 bytes. Some files were already using 40 bytes, so there was not much headroom left. If you have an old custom TZif parser, this is a reason to check whether it assumes a 50-byte limit.
  • Moldova's past was retroactively corrected. Moldova has transitioned on the EU schedule (forward at 03:00, back at 04:00) since 2022, but the data had incorrectly stayed at 02:00/03:00. This is the kind of fix that changes how past timestamps get interpreted in local time — a good example that tzdata updates do not only change the future.
  • The posixrules mechanism, obsolete since 2019b, was removed entirely.

There is also one thread running through all three releases this year: hardening of zic (the zone compiler). Integer- and buffer-overflow fixes for malicious input kept landing across 2026a/b/c. The reproduction inputs listed in NEWS, things like Zone Ouch 0 - LMT 9223372036854775807, clearly look like they came out of fuzzing. Few systems compile time zone source files received from outside a trust boundary with zic, but it is a reminder that tzcode is part of the supply chain too. There was also a decision in the opposite direction — the "TZif path restriction for unprivileged processes (require regular files, reject .. paths)" that was hardened in 2025c did not take hold on FreeBSD, and was reverted in 2026c. It is a realistic snapshot of infrastructure maintenance: even security hardening only survives if the ecosystem accepts it.

When Does Your Stack Get 2026c — Two Deadlines

Shipping the release is not the end of the story. I checked the actual propagation speed (as of 2026-07-17; only what I directly verified from each project's commit and package history is listed).

PathStatus
Go (golang/go lib/time)Merged 2026c the day after release, July 9
Debian (tzdata package)2026c-1 packaging complete
FedoraMost recent stable update is 2026b-1 (May 20)
OpenJDK mainlineMerged up through 2026b (April 27, JDK-8383175). 2026c not yet merged as of this writing
ICULatest maintenance release, 78.3 (March 17), bundles tzdata 2026a

A pattern emerges. Distributions and Go catch up within days; the JDK only reaches an actual JVM after its mainline merge rides a quarterly update release; and platforms that get their time zone data via ICU (browsers, some embedded systems) are tied to ICU's release cycle. Layer on top of that the build timing of container base images, the JVM's own tzdata copy, and per-runtime copies like pip's tzdata package, and it is not remotely rare for different processes on the same server to see different time zone data.

For this release, there are two deadlines worth putting on the calendar.

  1. 2026-09-20, 02:00 — Morocco and Western Sahara. Systems that have not updated by then will compute +01 afterward, one hour fast.
  2. 2026-11-01, 02:00 — BC and Alberta. Stale data will run a fall-back transition that no longer exists, dropping Vancouver to -08 and Edmonton to -07. After that, they will run one hour slow. Once NWT's legislation is finished, a third item may be added alongside a 2026d.

You can check right away, with zdump, which side your system is on.

# If 2026c is applied: you'll see the September 20 +01 -> +00 transition
zdump -v Africa/Casablanca | grep 2026

# If 2026c is applied: gmtoff stays at -21600 across the November 1 transition (MDT -> CST)
# If the data is stale: gmtoff drops from -21600 -> -25200 (MDT -> MST)
zdump -v America/Edmonton | grep 2026

Conversely, there are clearly cases where this does not matter this time around. If your service only serves Korean users, KST is unaffected by this release, and a backend that only stores and computes past timestamps in UTC will not break from the offset change alone. Three things are actually at risk — future local-time schedules in the affected regions (if you convert a "Casablanca 09:00 meeting" after September 20 to UTC using stale data and store it, it will fire at the wrong moment, off by an hour), local-time displays shown to users, and any logic that depends on isdst or on the abbreviation.

Closing

tzdb is an unusual piece of infrastructure where politics is the input and data is the output. This year's input was legislation from two Canadian provinces and a decree from Morocco; the output was three releases (soon to be four), and one deliberately wrong date kept in place until November for the sake of the CLDR ecosystem. To summarize:

  • BC (March 9) and Alberta (June 18) are already legally on permanent time, but tzdb carries them with a November 1 transition to work around CLDR 48.x — the offset is correct throughout.
  • Morocco and Western Sahara are on permanent +00 starting September 20, 02:00. tzdata 2026c needs to be deployed fleet-wide before then.
  • Code that depends on time zone abbreviations (assumptions like PST=-08) or on tm_isdst actually breaks this cycle. Compute with the zone ID and offset, and use the abbreviation for display only.

The less anyone reads the release notes for a piece of infrastructure, the more its existence only becomes visible after an hour has already gone missing. One line of zdump is enough to know in advance.

References

현재 단락 (1/93)

On July 8, 2026, the [IANA Time Zone Database](https://www.iana.org/time-zones) shipped tzdata 2026c...

작성 글자: 0원문 글자: 16,152작성 단락: 0/93