wherewhen.co

← Reference

Time-zone edge cases

68 cases where converting a time is not the arithmetic people expect — local times that never happened, local times that happened twice, offsets that are not a whole number of hours, calendar dates that a country skipped entirely, transitions that moved no clocks at all, and zones where daylight saving is the lower offset.

This is the corpus this site's own time-zone logic is tested against. It is published here because the cases are the useful artefact: each one names a zone, an instant, and the value a correct implementation produces, so it can be read as a reference or lifted directly into someone else's test suite.

64 of the 68 cases are frozen — they concern instants in the past, so no future release of the time-zone database can change them. The remaining 4 are marked volatile and re-verified on every release: 2 because they depend on rules a government could still change, and 2 because they concern pre-1970 local time, where the main database and its backzone file legitimately disagree.

Times that never happened

10 cases in the gap category of the tz-edge-cases corpus — local times that do not exist — with the value each one is expected to produce.
CaseZoneLocal time asked forGapShifting back / forward givesStability
gap-cairo-midnight-2023
Egypt re-adopted DST in 2023 and transitions at midnight, so 28 April has no 00:xx hour: the local day starts at 01:00.
Africa/Cairo2023-04-28T00:30:002023-04-28T00:00:00 → 2023-04-28T01:00:00
60 minutes
2023-04-27T23:30:00+02:00
2023-04-28T01:30:00+03:00
frozen
gap-casablanca-ramadan-end-2024
Morocco returns to +01:00 after Ramadan, creating a gap.
Africa/Casablanca2024-04-14T02:30:002024-04-14T02:00:00 → 2024-04-14T03:00:00
60 minutes
2024-04-14T01:30:00+00:00
2024-04-14T03:30:00+01:00
frozen
gap-casey-3hour-2020
Casey shifts by three hours, the largest routine jump in the database — larger than Troll's two.
Antarctica/Casey2020-10-04T01:30:002020-10-04T00:01:00.644531 → 2020-10-04T03:01:00.644531
180 minutes
2020-10-03T22:30:00+08:00
2020-10-04T04:30:00+11:00
frozen
gap-chatham-2024
Chatham transitions at 02:45 from a :45 base offset.
Pacific/Chatham2024-09-29T03:00:002024-09-29T02:45:00 → 2024-09-29T03:45:00
60 minutes
2024-09-29T02:00:00+12:45
2024-09-29T04:00:00+13:45
frozen
gap-lordhowe-30min-2024
Lord Howe Island shifts by 30 minutes, not 60.
Australia/Lord_Howe2024-10-06T02:15:002024-10-06T02:00:00 → 2024-10-06T02:30:00
30 minutes
2024-10-06T01:45:00+10:30
2024-10-06T02:45:00+11:00
frozen
gap-santiago-southern-2024
Southern hemisphere: spring forward occurs in September.
America/Santiago2024-09-08T00:30:002024-09-08T00:00:00 → 2024-09-08T01:00:00
60 minutes
2024-09-07T23:30:00-04:00
2024-09-08T01:30:00-03:00
frozen
gap-troll-2hr-2024
Troll station shifts by 2 hours, producing a 2-hour gap.
Antarctica/Troll2024-03-31T01:30:002024-03-31T01:00:00 → 2024-03-31T03:00:00
120 minutes
2024-03-30T23:30:00+00:00
2024-03-31T03:30:00+02:00
frozen
gap-uk-2024
UK transitions at 01:00 local, not 02:00 — off-by-one-hour trap.
Europe/London2024-03-31T01:30:002024-03-31T01:00:00 → 2024-03-31T02:00:00
60 minutes
2024-03-31T00:30:00+00:00
2024-03-31T02:30:00+01:00
frozen
gap-us-eastern-2024
Northern-hemisphere 60-minute spring forward; 02:30 never occurs.
America/New_York2024-03-10T02:30:002024-03-10T02:00:00 → 2024-03-10T03:00:00
60 minutes
2024-03-10T01:30:00-05:00
2024-03-10T03:30:00-04:00
frozen
volatile-us-eastern-2027-gap
Correct under current US rules; would change if permanent DST passes.
America/New_York2027-03-14T02:30:002027-03-14T02:00:00 → 2027-03-14T03:00:00
60 minutes
2027-03-14T01:30:00-05:00
2027-03-14T03:30:00-04:00
volatile — future rules

Times that happened twice

6 cases in the ambiguous category of the tz-edge-cases corpus — local times that occur twice — with the value each one is expected to produce.
CaseZoneLocal time asked forFirst occurrenceSecond occurrenceStability
ambiguous-auckland-2024
Southern hemisphere: fall back occurs in April.
Pacific/Auckland2024-04-07T02:30:00{'instantUtc': '2024-04-06T13:30:00+00:00', 'utcOffset': '+13:00', 'abbreviation': 'NZDT', 'isDst': True}{'instantUtc': '2024-04-06T14:30:00+00:00', 'utcOffset': '+12:00', 'abbreviation': 'NZST', 'isDst': False}frozen
ambiguous-berlin-2024
EU-wide transition at 03:00 local; 02:30 occurs twice.
Europe/Berlin2024-10-27T02:30:00{'instantUtc': '2024-10-27T00:30:00+00:00', 'utcOffset': '+02:00', 'abbreviation': 'CEST', 'isDst': True}{'instantUtc': '2024-10-27T01:30:00+00:00', 'utcOffset': '+01:00', 'abbreviation': 'CET', 'isDst': False}frozen
ambiguous-casablanca-ramadan-start-2024
Morocco drops to +00:00 for Ramadan — an inverted DST fall-back.
Africa/Casablanca2024-03-10T02:30:00{'instantUtc': '2024-03-10T01:30:00+00:00', 'utcOffset': '+01:00', 'abbreviation': '+01', 'isDst': False}{'instantUtc': '2024-03-10T02:30:00+00:00', 'utcOffset': '+00:00', 'abbreviation': '+00', 'isDst': True}frozen
ambiguous-lordhowe-30min-2024
30-minute ambiguity window rather than the usual 60.
Australia/Lord_Howe2024-04-07T01:45:00{'instantUtc': '2024-04-06T14:45:00+00:00', 'utcOffset': '+11:00', 'abbreviation': '+11', 'isDst': True}{'instantUtc': '2024-04-06T15:15:00+00:00', 'utcOffset': '+10:30', 'abbreviation': '+1030', 'isDst': False}frozen
ambiguous-santiago-2024
Chile transitions at 24:00, so the ambiguous window is late evening.
America/Santiago2024-04-06T23:30:00{'instantUtc': '2024-04-07T02:30:00+00:00', 'utcOffset': '-03:00', 'abbreviation': '-03', 'isDst': True}{'instantUtc': '2024-04-07T03:30:00+00:00', 'utcOffset': '-04:00', 'abbreviation': '-04', 'isDst': False}frozen
ambiguous-us-eastern-2024
01:30 occurs twice; EDT then EST.
America/New_York2024-11-03T01:30:00{'instantUtc': '2024-11-03T05:30:00+00:00', 'utcOffset': '-04:00', 'abbreviation': 'EDT', 'isDst': True}{'instantUtc': '2024-11-03T06:30:00+00:00', 'utcOffset': '-05:00', 'abbreviation': 'EST', 'isDst': False}frozen

Calendar dates a place skipped

1 case in the skipped_date category of the tz-edge-cases corpus — local times that do not exist — with the value each one is expected to produce.
CaseZoneLocal time asked forGapShifting back / forward givesStability
skipped-apia-2011-12-30
Samoa skipped 30 Dec 2011 entirely when crossing the date line.
Pacific/Apia2011-12-30T12:00:002011-12-30T00:00:00 → 2011-12-31T00:00:00
1440 minutes
2011-12-29T12:00:00-10:00
2011-12-31T12:00:00+14:00
frozen
2 cases in the skipped_date category of the tz-edge-cases corpus — single-instant offset resolutions — with the value each one is expected to produce.
CaseZoneLocal timeUTC offsetAbbreviationDaylight savingStability
skipped-apia-after
Day after the skip: +14:00, a 24-hour jump.
Pacific/Apia2011-12-31T12:00:00+14:00+14in effectfrozen
skipped-apia-before
Day before the skip: -10:00.
Pacific/Apia2011-12-29T12:00:00-10:00-10in effectfrozen

Rule changes and abolitions

7 cases in the rule_change category of the tz-edge-cases corpus — single-instant offset resolutions — with the value each one is expected to produce.
CaseZoneLocal timeUTC offsetAbbreviationDaylight savingStability
rulechange-istanbul-2015-winter
Istanbul in January 2015, still alternating: EET +02:00.
Europe/Istanbul2015-01-15T12:00:00+02:00EETnot in effectfrozen
rulechange-istanbul-2017-winter
January 2017: +03:00. Abolishing DST left the clocks an hour forward of where they used to be in winter — the opposite of Iran and Mexico, which settled on their standard offset.
Europe/Istanbul2017-01-15T12:00:00+03:00+03not in effectfrozen
rulechange-juarez-2023-still-dst
Mexican border municipalities kept US DST rules after 2022.
America/Ciudad_Juarez2023-06-15T12:00:00-06:00MDTin effectfrozen
rulechange-mazatlan-2021-dst
Mexico observed DST in 2021.
America/Mazatlan2021-06-15T12:00:00-06:00MDTin effectfrozen
rulechange-mazatlan-2023-no-dst
Mexico abolished DST for most of the country in 2022.
America/Mazatlan2023-06-15T12:00:00-07:00MSTnot in effectfrozen
rulechange-tehran-2021-dst
Iran observed DST (+04:30) in 2021.
Asia/Tehran2021-06-15T12:00:00+04:30+0430in effectfrozen
rulechange-tehran-2023-no-dst
Iran abolished DST in 2022; same date is now +03:30.
Asia/Tehran2023-06-15T12:00:00+03:30+0330not in effectfrozen

Transitions that moved no clocks

6 cases in the zero_offset_transition category of the tz-edge-cases corpus — single-instant offset resolutions — with the value each one is expected to produce.
CaseZoneLocal timeUTC offsetAbbreviationDaylight savingStability
zerooffset-asuncion-2024-dst
Paraguay began daylight saving as usual in October 2024: -03:00, DST set.
America/Asuncion2024-10-10T12:00:00-03:00-03in effectfrozen
zerooffset-asuncion-2024-permanent
Nine days later Paraguay made that offset permanent. Same -03:00, DST flag clear, no clock movement.
America/Asuncion2024-10-20T12:00:00-03:00-03not in effectfrozen
zerooffset-guam-2000-gst
Guam as GST, +10:00, no DST.
Pacific/Guam2000-12-01T12:00:00+10:00GSTnot in effectfrozen
zerooffset-guam-2001-chst
Renamed to ChST. Offset and DST flag both unchanged — the abbreviation is the only thing that moved.
Pacific/Guam2001-01-15T12:00:00+10:00ChSTnot in effectfrozen
zerooffset-istanbul-2016-dst
Türkiye's last summer of daylight saving: +03:00, DST flag set.
Europe/Istanbul2016-07-15T12:00:00+03:00EESTin effectfrozen
zerooffset-istanbul-2017-permanent
The same +03:00 a year later, DST flag now clear and the abbreviation changed EEST to +03. The September 2016 transition moved no clocks at all.
Europe/Istanbul2017-07-15T12:00:00+03:00+03not in effectfrozen

Southern-hemisphere and inverted DST

4 cases in the inverted_dst category of the tz-edge-cases corpus — single-instant offset resolutions — with the value each one is expected to produce.
CaseZoneLocal timeUTC offsetAbbreviationDaylight savingStability
inverted-casablanca-after-ramadan-2024
Morocco back at +01:00 after Ramadan.
Africa/Casablanca2024-04-20T12:00:00+01:00+01not in effectfrozen
inverted-casablanca-before-ramadan-2024
Morocco at its normal +01:00 before Ramadan.
Africa/Casablanca2024-03-01T12:00:00+01:00+01not in effectfrozen
inverted-casablanca-during-ramadan-2024
Morocco at +00:00 during Ramadan — offset DROPS, on a lunar date.
Africa/Casablanca2024-03-15T12:00:00+00:00+00in effectfrozen
volatile-casablanca-2027
Depends on the projected lunar Ramadan window for 2027.
Africa/Casablanca2027-06-15T12:00:00+00:00+00not in effectvolatile — future rules

Where daylight saving is the lower offset

4 cases in the negative_dst category of the tz-edge-cases corpus — single-instant offset resolutions — with the value each one is expected to produce.
CaseZoneLocal timeUTC offsetAbbreviationDaylight savingStability
negativedst-dublin-january
Irish Standard Time is the SUMMER offset. Winter GMT is modelled as negative daylight saving, so isDst is true in January at +00:00.
Europe/Dublin2024-01-15T12:00:00+00:00GMTin effectfrozen
negativedst-dublin-july
July is +01:00 IST with isDst false — inverted relative to every other EU zone, which flag their summer offset as DST.
Europe/Dublin2024-07-15T12:00:00+01:00ISTnot in effectfrozen
negativedst-windhoek-2016-january
Namibia before 2017: January is CAT +02:00 with isDst false.
Africa/Windhoek2016-01-15T12:00:00+02:00CATnot in effectfrozen
negativedst-windhoek-2016-june
June is WAT +01:00 with isDst TRUE. The winter offset carries the DST flag, and 'West Africa Time' is the daylight-saving name.
Africa/Windhoek2016-06-15T12:00:00+01:00WATin effectfrozen

Zones that changed their standard offset

6 cases in the offset_move category of the tz-edge-cases corpus — single-instant offset resolutions — with the value each one is expected to produce.
CaseZoneLocal timeUTC offsetAbbreviationDaylight savingStability
offsetmove-almaty-2024-after
+05:00 afterwards. The transition fell on 29 February — a standard-offset change, no DST anywhere near it, on a leap day.
Asia/Almaty2024-03-15T12:00:00+05:00+05not in effectfrozen
offsetmove-almaty-2024-before
Kazakhstan at +06:00 before unifying its two zones.
Asia/Almaty2024-02-15T12:00:00+06:00+06not in effectfrozen
offsetmove-caracas-2016-after
Retired to -04:00 in May 2016. A hardcoded offset table written before then is still wrong today.
America/Caracas2016-06-15T12:00:00-04:00-04not in effectfrozen
offsetmove-caracas-2016-before
Venezuela at -04:30, a sub-hour STANDARD offset.
America/Caracas2016-04-15T12:00:00-04:30-0430not in effectfrozen
offsetmove-famagusta-2017-plus03
Northern Cyprus followed Türkiye to permanent +03:00 in 2016.
Asia/Famagusta2017-01-15T12:00:00+03:00+03not in effectfrozen
offsetmove-famagusta-2018-reverted
Then reverted to EET +02:00 in October 2017 — the same decision taken and untaken thirteen months apart, while Istanbul kept +03:00.
Asia/Famagusta2018-01-15T12:00:00+02:00EETnot in effectfrozen

Offsets that are not a whole hour

5 cases in the sub_hour_offset category of the tz-edge-cases corpus — single-instant offset resolutions — with the value each one is expected to produce.
CaseZoneLocal timeUTC offsetAbbreviationDaylight savingStability
offset-eucla-0845
+08:45, one of the rarest offsets in use.
Australia/Eucla2024-06-15T09:00:00+08:45+0845not in effectfrozen
offset-kathmandu-0545
+05:45 base offset; breaks integer-hour offset models.
Asia/Kathmandu2024-06-15T09:00:00+05:45+0545not in effectfrozen
offset-kolkata-0530
+05:30 base offset, no DST.
Asia/Kolkata2024-06-15T09:00:00+05:30ISTnot in effectfrozen
offset-marquesas-neg0930
-09:30; negative sub-hour offset, a common sign-handling bug.
Pacific/Marquesas2024-06-15T09:00:00-09:30-0930not in effectfrozen
offset-monrovia-1971-neg004430
Liberia kept -00:44:30 by law until January 1972: a legal offset with a seconds component. Unlike the pre-1970 LMT cases it is frozen, so a mismatch here is a real bug.
Africa/Monrovia1971-06-15T12:00:00-00:44:30MMTnot in effectfrozen

One country, more than one answer

4 cases in the intra_country category of the tz-edge-cases corpus — single-instant offset resolutions — with the value each one is expected to produce.
CaseZoneLocal timeUTC offsetAbbreviationDaylight savingStability
intracountry-brisbane-january
Brisbane does not observe DST (+10:00) — same country, same instant.
Australia/Brisbane2024-01-15T12:00:00+10:00AESTnot in effectfrozen
intracountry-denver-july
Denver does (-06:00), despite sharing a nominal zone name.
America/Denver2024-07-01T12:00:00-06:00MDTin effectfrozen
intracountry-phoenix-july
Arizona does not observe DST (-07:00).
America/Phoenix2024-07-01T12:00:00-07:00MSTnot in effectfrozen
intracountry-sydney-january
Sydney observes DST in January (+11:00).
Australia/Sydney2024-01-15T12:00:00+11:00AEDTin effectfrozen

Before standard time

2 cases in the lmt category of the tz-edge-cases corpus — single-instant offset resolutions — with the value each one is expected to produce.
CaseZoneLocal timeUTC offsetAbbreviationDaylight savingStability
lmt-amsterdam-1890
Offset is not a whole number of minutes. Also build-dependent: upstream merges pre-1970 Amsterdam into Brussels (+00:17:30 BMT), while backzone builds keep +00:19:32 AMT.
Europe/Amsterdam1890-06-15T12:00:00+00:17:30BMTnot in effectvolatile — pre 1970 build variance
lmt-kolkata-1880
Madras Mean Time, +05:21:10. Agrees across common builds today, but pre-1970 data carries no stability guarantee.
Asia/Kolkata1880-06-15T12:00:00+05:21:10MMTnot in effectvolatile — pre 1970 build variance

Conversions between two zones

11 cases in the conversion category of the tz-edge-cases corpus — conversions between two zones — with the value each one is expected to produce.
CaseFromToResultOffset changeStability
conv-ambiguous-source-fold0
Ambiguous source time, first occurrence (EDT).
America/New_York
2024-11-03T01:30:00
UTC2024-11-03T05:30:00
same calendar day
-04:00 → +00:00
+240 minutes
frozen
conv-ambiguous-source-fold1
Same wall clock, second occurrence (EST) — one hour later in UTC.
America/New_York
2024-11-03T01:30:00
UTC2024-11-03T06:30:00
same calendar day
-05:00 → +00:00
+300 minutes
frozen
conv-apia-la-datechange
Near the date line: same instant, previous calendar day at the target.
Pacific/Apia
2024-06-15T10:00:00
America/Los_Angeles2024-06-14T14:00:00
-1 calendar day
+13:00 → -07:00
-1200 minutes
frozen
conv-istanbul-athens-divergence
Istanbul and Athens shared EET/EEST until September 2016. Afterwards they differ by an hour in winter and not at all in summer.
Europe/Istanbul
2017-01-15T12:00:00
Europe/Athens2017-01-15T11:00:00
same calendar day
+03:00 → +02:00
-60 minutes
frozen
conv-kathmandu-kolkata-15min
Neighbouring zones 15 minutes apart (+05:45 to +05:30).
Asia/Kathmandu
2024-06-15T09:00:00
Asia/Kolkata2024-06-15T08:45:00
same calendar day
+05:45 → +05:30
-15 minutes
frozen
conv-kiritimati-midway-25h
+14:00 to -11:00: the widest spread in use, 25 hours, landing on the previous calendar day.
Pacific/Kiritimati
2024-06-15T10:00:00
Pacific/Midway2024-06-14T09:00:00
-1 calendar day
+14:00 → -11:00
-1500 minutes
frozen
conv-kolkata-eucla-315
Delta of 3h15m: neither endpoint nor the difference is a whole hour.
Asia/Kolkata
2024-06-15T09:00:00
Australia/Eucla2024-06-15T12:15:00
same calendar day
+05:30 → +08:45
+195 minutes
frozen
conv-kolkata-newyork-dayshift
Conversion moves backwards across the date boundary.
Asia/Kolkata
2024-06-15T02:00:00
America/New_York2024-06-14T16:30:00
-1 calendar day
+05:30 → -04:00
-570 minutes
frozen
conv-ny-london-desync-march
US has sprung forward, UK has not: the gap is 4 hours, not the usual 5.
America/New_York
2024-03-10T09:00:00
Europe/London2024-03-10T13:00:00
same calendar day
-04:00 → +00:00
+240 minutes
frozen
conv-ny-london-desync-october
UK has fallen back, US has not: again 4 hours, in the other direction.
America/New_York
2024-10-27T09:00:00
Europe/London2024-10-27T13:00:00
same calendar day
-04:00 → +00:00
+240 minutes
frozen
conv-ny-london-normal
Baseline: the usual 5-hour gap, for contrast with the two above.
America/New_York
2024-06-15T09:00:00
Europe/London2024-06-15T14:00:00
same calendar day
-04:00 → +01:00
+300 minutes
frozen

Where this comes from

The corpus is tz-edge-cases, version 1.1.0, generated against IANA time-zone database release 2026c and released into the public domain under CC0. This site vendors a pinned copy; the machine-readable form is fixtures.json and its JSON Schema.

The values in these tables are the corpus's own expected values, printed as they are stored. They are not recomputed for display — and they do not need to be, because this build has already checked them: every frozen case is compared against the build's own time-zone data (release 2026b) before any page is generated, and a single mismatch fails the build rather than publishing a table.

That check covers the frozen cases, and the honest limit is worth stating twice over. It shows that release 2026b agrees with the corpus, not that either is right about the world. And it does not cover the 4 volatile cases: the 2 that depend on future rules cannot be checked against anything yet, and the 2 pre-1970 ones this build can actively disagree with — the corpus was generated against the main database and this build resolves those instants a couple of minutes differently, which is the documented disagreement between tzdb and its backzone file rather than an error in either. Every volatile case is marked as one in the tables above.

For what each zone does across a whole year rather than at a single instant, see daylight saving time by zone.