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
| Case | Zone | Local time asked for | Gap | Shifting back / forward gives | Stability |
|---|---|---|---|---|---|
gap-cairo-midnight-2023Egypt 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/Cairo | 2023-04-28T00:30:00 | 2023-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-2024Morocco returns to +01:00 after Ramadan, creating a gap. | Africa/Casablanca | 2024-04-14T02:30:00 | 2024-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-2020Casey shifts by three hours, the largest routine jump in the database — larger than Troll's two. | Antarctica/Casey | 2020-10-04T01:30:00 | 2020-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-2024Chatham transitions at 02:45 from a :45 base offset. | Pacific/Chatham | 2024-09-29T03:00:00 | 2024-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-2024Lord Howe Island shifts by 30 minutes, not 60. | Australia/Lord_Howe | 2024-10-06T02:15:00 | 2024-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-2024Southern hemisphere: spring forward occurs in September. | America/Santiago | 2024-09-08T00:30:00 | 2024-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-2024Troll station shifts by 2 hours, producing a 2-hour gap. | Antarctica/Troll | 2024-03-31T01:30:00 | 2024-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-2024UK transitions at 01:00 local, not 02:00 — off-by-one-hour trap. | Europe/London | 2024-03-31T01:30:00 | 2024-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-2024Northern-hemisphere 60-minute spring forward; 02:30 never occurs. | America/New_York | 2024-03-10T02:30:00 | 2024-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-gapCorrect under current US rules; would change if permanent DST passes. | America/New_York | 2027-03-14T02:30:00 | 2027-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
| Case | Zone | Local time asked for | First occurrence | Second occurrence | Stability |
|---|---|---|---|---|---|
ambiguous-auckland-2024Southern hemisphere: fall back occurs in April. | Pacific/Auckland | 2024-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-2024EU-wide transition at 03:00 local; 02:30 occurs twice. | Europe/Berlin | 2024-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-2024Morocco drops to +00:00 for Ramadan — an inverted DST fall-back. | Africa/Casablanca | 2024-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-202430-minute ambiguity window rather than the usual 60. | Australia/Lord_Howe | 2024-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-2024Chile transitions at 24:00, so the ambiguous window is late evening. | America/Santiago | 2024-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-202401:30 occurs twice; EDT then EST. | America/New_York | 2024-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
| Case | Zone | Local time asked for | Gap | Shifting back / forward gives | Stability |
|---|---|---|---|---|---|
skipped-apia-2011-12-30Samoa skipped 30 Dec 2011 entirely when crossing the date line. | Pacific/Apia | 2011-12-30T12:00:00 | 2011-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 |
| Case | Zone | Local time | UTC offset | Abbreviation | Daylight saving | Stability |
|---|---|---|---|---|---|---|
skipped-apia-afterDay after the skip: +14:00, a 24-hour jump. | Pacific/Apia | 2011-12-31T12:00:00 | +14:00 | +14 | in effect | frozen |
skipped-apia-beforeDay before the skip: -10:00. | Pacific/Apia | 2011-12-29T12:00:00 | -10:00 | -10 | in effect | frozen |
Rule changes and abolitions
| Case | Zone | Local time | UTC offset | Abbreviation | Daylight saving | Stability |
|---|---|---|---|---|---|---|
rulechange-istanbul-2015-winterIstanbul in January 2015, still alternating: EET +02:00. | Europe/Istanbul | 2015-01-15T12:00:00 | +02:00 | EET | not in effect | frozen |
rulechange-istanbul-2017-winterJanuary 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/Istanbul | 2017-01-15T12:00:00 | +03:00 | +03 | not in effect | frozen |
rulechange-juarez-2023-still-dstMexican border municipalities kept US DST rules after 2022. | America/Ciudad_Juarez | 2023-06-15T12:00:00 | -06:00 | MDT | in effect | frozen |
rulechange-mazatlan-2021-dstMexico observed DST in 2021. | America/Mazatlan | 2021-06-15T12:00:00 | -06:00 | MDT | in effect | frozen |
rulechange-mazatlan-2023-no-dstMexico abolished DST for most of the country in 2022. | America/Mazatlan | 2023-06-15T12:00:00 | -07:00 | MST | not in effect | frozen |
rulechange-tehran-2021-dstIran observed DST (+04:30) in 2021. | Asia/Tehran | 2021-06-15T12:00:00 | +04:30 | +0430 | in effect | frozen |
rulechange-tehran-2023-no-dstIran abolished DST in 2022; same date is now +03:30. | Asia/Tehran | 2023-06-15T12:00:00 | +03:30 | +0330 | not in effect | frozen |
Transitions that moved no clocks
| Case | Zone | Local time | UTC offset | Abbreviation | Daylight saving | Stability |
|---|---|---|---|---|---|---|
zerooffset-asuncion-2024-dstParaguay began daylight saving as usual in October 2024: -03:00, DST set. | America/Asuncion | 2024-10-10T12:00:00 | -03:00 | -03 | in effect | frozen |
zerooffset-asuncion-2024-permanentNine days later Paraguay made that offset permanent. Same -03:00, DST flag clear, no clock movement. | America/Asuncion | 2024-10-20T12:00:00 | -03:00 | -03 | not in effect | frozen |
zerooffset-guam-2000-gstGuam as GST, +10:00, no DST. | Pacific/Guam | 2000-12-01T12:00:00 | +10:00 | GST | not in effect | frozen |
zerooffset-guam-2001-chstRenamed to ChST. Offset and DST flag both unchanged — the abbreviation is the only thing that moved. | Pacific/Guam | 2001-01-15T12:00:00 | +10:00 | ChST | not in effect | frozen |
zerooffset-istanbul-2016-dstTürkiye's last summer of daylight saving: +03:00, DST flag set. | Europe/Istanbul | 2016-07-15T12:00:00 | +03:00 | EEST | in effect | frozen |
zerooffset-istanbul-2017-permanentThe 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/Istanbul | 2017-07-15T12:00:00 | +03:00 | +03 | not in effect | frozen |
Southern-hemisphere and inverted DST
| Case | Zone | Local time | UTC offset | Abbreviation | Daylight saving | Stability |
|---|---|---|---|---|---|---|
inverted-casablanca-after-ramadan-2024Morocco back at +01:00 after Ramadan. | Africa/Casablanca | 2024-04-20T12:00:00 | +01:00 | +01 | not in effect | frozen |
inverted-casablanca-before-ramadan-2024Morocco at its normal +01:00 before Ramadan. | Africa/Casablanca | 2024-03-01T12:00:00 | +01:00 | +01 | not in effect | frozen |
inverted-casablanca-during-ramadan-2024Morocco at +00:00 during Ramadan — offset DROPS, on a lunar date. | Africa/Casablanca | 2024-03-15T12:00:00 | +00:00 | +00 | in effect | frozen |
volatile-casablanca-2027Depends on the projected lunar Ramadan window for 2027. | Africa/Casablanca | 2027-06-15T12:00:00 | +00:00 | +00 | not in effect | volatile — future rules |
Where daylight saving is the lower offset
| Case | Zone | Local time | UTC offset | Abbreviation | Daylight saving | Stability |
|---|---|---|---|---|---|---|
negativedst-dublin-januaryIrish Standard Time is the SUMMER offset. Winter GMT is modelled as negative daylight saving, so isDst is true in January at +00:00. | Europe/Dublin | 2024-01-15T12:00:00 | +00:00 | GMT | in effect | frozen |
negativedst-dublin-julyJuly is +01:00 IST with isDst false — inverted relative to every other EU zone, which flag their summer offset as DST. | Europe/Dublin | 2024-07-15T12:00:00 | +01:00 | IST | not in effect | frozen |
negativedst-windhoek-2016-januaryNamibia before 2017: January is CAT +02:00 with isDst false. | Africa/Windhoek | 2016-01-15T12:00:00 | +02:00 | CAT | not in effect | frozen |
negativedst-windhoek-2016-juneJune is WAT +01:00 with isDst TRUE. The winter offset carries the DST flag, and 'West Africa Time' is the daylight-saving name. | Africa/Windhoek | 2016-06-15T12:00:00 | +01:00 | WAT | in effect | frozen |
Zones that changed their standard offset
| Case | Zone | Local time | UTC offset | Abbreviation | Daylight saving | Stability |
|---|---|---|---|---|---|---|
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/Almaty | 2024-03-15T12:00:00 | +05:00 | +05 | not in effect | frozen |
offsetmove-almaty-2024-beforeKazakhstan at +06:00 before unifying its two zones. | Asia/Almaty | 2024-02-15T12:00:00 | +06:00 | +06 | not in effect | frozen |
offsetmove-caracas-2016-afterRetired to -04:00 in May 2016. A hardcoded offset table written before then is still wrong today. | America/Caracas | 2016-06-15T12:00:00 | -04:00 | -04 | not in effect | frozen |
offsetmove-caracas-2016-beforeVenezuela at -04:30, a sub-hour STANDARD offset. | America/Caracas | 2016-04-15T12:00:00 | -04:30 | -0430 | not in effect | frozen |
offsetmove-famagusta-2017-plus03Northern Cyprus followed Türkiye to permanent +03:00 in 2016. | Asia/Famagusta | 2017-01-15T12:00:00 | +03:00 | +03 | not in effect | frozen |
offsetmove-famagusta-2018-revertedThen reverted to EET +02:00 in October 2017 — the same decision taken and untaken thirteen months apart, while Istanbul kept +03:00. | Asia/Famagusta | 2018-01-15T12:00:00 | +02:00 | EET | not in effect | frozen |
Offsets that are not a whole hour
| Case | Zone | Local time | UTC offset | Abbreviation | Daylight saving | Stability |
|---|---|---|---|---|---|---|
offset-eucla-0845+08:45, one of the rarest offsets in use. | Australia/Eucla | 2024-06-15T09:00:00 | +08:45 | +0845 | not in effect | frozen |
offset-kathmandu-0545+05:45 base offset; breaks integer-hour offset models. | Asia/Kathmandu | 2024-06-15T09:00:00 | +05:45 | +0545 | not in effect | frozen |
offset-kolkata-0530+05:30 base offset, no DST. | Asia/Kolkata | 2024-06-15T09:00:00 | +05:30 | IST | not in effect | frozen |
offset-marquesas-neg0930-09:30; negative sub-hour offset, a common sign-handling bug. | Pacific/Marquesas | 2024-06-15T09:00:00 | -09:30 | -0930 | not in effect | frozen |
offset-monrovia-1971-neg004430Liberia 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/Monrovia | 1971-06-15T12:00:00 | -00:44:30 | MMT | not in effect | frozen |
One country, more than one answer
| Case | Zone | Local time | UTC offset | Abbreviation | Daylight saving | Stability |
|---|---|---|---|---|---|---|
intracountry-brisbane-januaryBrisbane does not observe DST (+10:00) — same country, same instant. | Australia/Brisbane | 2024-01-15T12:00:00 | +10:00 | AEST | not in effect | frozen |
intracountry-denver-julyDenver does (-06:00), despite sharing a nominal zone name. | America/Denver | 2024-07-01T12:00:00 | -06:00 | MDT | in effect | frozen |
intracountry-phoenix-julyArizona does not observe DST (-07:00). | America/Phoenix | 2024-07-01T12:00:00 | -07:00 | MST | not in effect | frozen |
intracountry-sydney-januarySydney observes DST in January (+11:00). | Australia/Sydney | 2024-01-15T12:00:00 | +11:00 | AEDT | in effect | frozen |
Before standard time
| Case | Zone | Local time | UTC offset | Abbreviation | Daylight saving | Stability |
|---|---|---|---|---|---|---|
lmt-amsterdam-1890Offset 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/Amsterdam | 1890-06-15T12:00:00 | +00:17:30 | BMT | not in effect | volatile — pre 1970 build variance |
lmt-kolkata-1880Madras Mean Time, +05:21:10. Agrees across common builds today, but pre-1970 data carries no stability guarantee. | Asia/Kolkata | 1880-06-15T12:00:00 | +05:21:10 | MMT | not in effect | volatile — pre 1970 build variance |
Conversions between two zones
| Case | From | To | Result | Offset change | Stability |
|---|---|---|---|---|---|
conv-ambiguous-source-fold0Ambiguous source time, first occurrence (EDT). | America/New_York2024-11-03T01:30:00 | UTC | 2024-11-03T05:30:00 same calendar day | -04:00 → +00:00 +240 minutes | frozen |
conv-ambiguous-source-fold1Same wall clock, second occurrence (EST) — one hour later in UTC. | America/New_York2024-11-03T01:30:00 | UTC | 2024-11-03T06:30:00 same calendar day | -05:00 → +00:00 +300 minutes | frozen |
conv-apia-la-datechangeNear the date line: same instant, previous calendar day at the target. | Pacific/Apia2024-06-15T10:00:00 | America/Los_Angeles | 2024-06-14T14:00:00 -1 calendar day | +13:00 → -07:00 -1200 minutes | frozen |
conv-istanbul-athens-divergenceIstanbul and Athens shared EET/EEST until September 2016. Afterwards they differ by an hour in winter and not at all in summer. | Europe/Istanbul2017-01-15T12:00:00 | Europe/Athens | 2017-01-15T11:00:00 same calendar day | +03:00 → +02:00 -60 minutes | frozen |
conv-kathmandu-kolkata-15minNeighbouring zones 15 minutes apart (+05:45 to +05:30). | Asia/Kathmandu2024-06-15T09:00:00 | Asia/Kolkata | 2024-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/Kiritimati2024-06-15T10:00:00 | Pacific/Midway | 2024-06-14T09:00:00 -1 calendar day | +14:00 → -11:00 -1500 minutes | frozen |
conv-kolkata-eucla-315Delta of 3h15m: neither endpoint nor the difference is a whole hour. | Asia/Kolkata2024-06-15T09:00:00 | Australia/Eucla | 2024-06-15T12:15:00 same calendar day | +05:30 → +08:45 +195 minutes | frozen |
conv-kolkata-newyork-dayshiftConversion moves backwards across the date boundary. | Asia/Kolkata2024-06-15T02:00:00 | America/New_York | 2024-06-14T16:30:00 -1 calendar day | +05:30 → -04:00 -570 minutes | frozen |
conv-ny-london-desync-marchUS has sprung forward, UK has not: the gap is 4 hours, not the usual 5. | America/New_York2024-03-10T09:00:00 | Europe/London | 2024-03-10T13:00:00 same calendar day | -04:00 → +00:00 +240 minutes | frozen |
conv-ny-london-desync-octoberUK has fallen back, US has not: again 4 hours, in the other direction. | America/New_York2024-10-27T09:00:00 | Europe/London | 2024-10-27T13:00:00 same calendar day | -04:00 → +00:00 +240 minutes | frozen |
conv-ny-london-normalBaseline: the usual 5-hour gap, for contrast with the two above. | America/New_York2024-06-15T09:00:00 | Europe/London | 2024-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.