# Temporal Interoperability KB > Every conversion from a timestamp and its zone to the canonical hour-of-week slot (0-167, slot 0 = Monday 00:00 UTC): DST gaps and folds, sub-hour offsets, broadcast days, dayparts, ISO weeks, and the edge cases that break them. ## Chapters - [Broadcast Day](https://etherdata.ai/blog/time-interop-kb/docs/broadcast-day): A broadcast day is a local day that starts at a declared cutover, not at midnight, so hours before the cutover belong to the previous broadcast day. - [Causal Time vs Physical Time](https://etherdata.ai/blog/time-interop-kb/docs/causal-time-vs-physical-time): Two events can have UTC times A=12:00:03, B=12:00:02 while A happened before B. Physical (UTC) order and causal order are different relations, and event sourcing needs the causal one. - [Cycle vs Interval](https://etherdata.ai/blog/time-interop-kb/docs/cycle-vs-interval): An hour-of-week slot is a position in a repeating weekly cycle; a UTC window is a concrete dated interval. They look interchangeable and are not — every conversion result declares which one it is via temporal_kind. - [Daypart to Slots](https://etherdata.ai/blog/time-interop-kb/docs/daypart-to-slots): A daypart is a local clock band such as primetime; mapping it to canonical UTC slots for a zone and ISO week produces a weighted slot-set whenever the band straddles a UTC hour boundary. - [DST Handling](https://etherdata.ai/blog/time-interop-kb/docs/dst-handling): Daylight saving time creates a nonexistent local time at spring-forward and an ambiguous one at fall-back; both must be resolved by a declared, explicit policy rather than a hardcoded transition hour. - [Holidays](https://etherdata.ai/blog/time-interop-kb/docs/holidays): National holiday flags derived from public-calendar rules rather than a scraped feed; v0 covers US, UK, and Canada, and a holiday is a 24-local-hour slot-set, not a single slot. - [ISO Week](https://etherdata.ai/blog/time-interop-kb/docs/iso-week): ISO-8601 defines the week as Monday-start with week 1 containing the first Thursday of the year, producing a week-numbering year that can diverge from the calendar year and years with 53 weeks. - [Measurement Semantics](https://etherdata.ai/blog/time-interop-kb/docs/measurement-semantics): Two platforms can agree on the same UTC slot and still measure different things, because time carries local-experience, causal, and attribution meanings the slot alone does not resolve. - [Requested vs. Executed Time](https://etherdata.ai/blog/time-interop-kb/docs/requested-vs-executed-time): A local wall time is what was requested; the UTC slot is what was executed; a DST gap or fold means the two cannot both hold exactly, and the record must say so rather than silently pick one. - [Resolution and Grain](https://etherdata.ai/blog/time-interop-kb/docs/resolution-and-grain): Instant, hour-of-week slot, broadcast day, daypart, and ISO week trade off statistical power, privacy, and platform reporting constraints; coarsening is a declared choice, never a silent default. - [Slot to UTC Window](https://etherdata.ai/blog/time-interop-kb/docs/slot-to-utc-window): A slot paired with an ISO week resolves deterministically to a one-hour UTC interval; reporting must honor the requested grain exactly or reject the request, never silently roll it up. - [The Temporal Interoperability Model](https://etherdata.ai/blog/time-interop-kb/docs/temporal-interoperability-model): A timestamp with a zone is a request; the pipeline resolves it to a UTC instant, buckets it into a slot 0-167, and keys it to an ISO week before anything is measured or reported. - [Temporal Provenance](https://etherdata.ai/blog/time-interop-kb/docs/temporal-provenance): A timestamp is not one moment but a lifecycle of moments produced by a clock of a stated source, accuracy, and model — the time analog of geometry provenance. - [The 168 Axis](https://etherdata.ai/blog/time-interop-kb/docs/the-168-axis): The hour-of-week slot, 0-167, is a deterministic function of the UTC instant alone; paired with an ISO week it becomes a unique coordinate, the time analog of an H3 cell. - [Time Uncertainty](https://etherdata.ai/blog/time-interop-kb/docs/time-uncertainty): An instant is a point estimate plus an error bar; near an hour boundary the ±window straddles two slots, so the assignment is not unique — the temporal weighted crosswalk. - [Timestamp to Slot](https://etherdata.ai/blog/time-interop-kb/docs/timestamp-to-slot): A local timestamp and an IANA zone resolve through the tz database to a UTC instant, with DST gaps and folds handled by a declared policy, then bucket deterministically into an hour-of-week slot 0-167. - [Timezone Database](https://etherdata.ai/blog/time-interop-kb/docs/timezone-database): The IANA tz database is the versioned source of truth for zone offsets and DST rules; an offset is not a zone, and the database itself changes roughly ten times a year. - [Week Systems](https://etherdata.ai/blog/time-interop-kb/docs/week-systems): ISO, US/retail, broadcast (Nielsen), and Middle-East week conventions disagree on the start day and on how weeks roll into months and years, so a bare week number is meaningless without its system. ## Edge cases - [Half-hour offset zones](https://etherdata.ai/blog/time-interop-kb/edge-cases/half-hour-offset-zones): India (+5:30), Sri Lanka (+5:30), central Australia ACST (+9:30), Iran (+3:30), Afghanistan (+4:30), Myanmar (+6:30), and Newfoundland (-3:30) sit a half hour o - [45-minute offset zones](https://etherdata.ai/blog/time-interop-kb/edge-cases/forty-five-minute-offset-zones): Nepal (+5:45), the Chatham Islands (+12:45 / +13:45 DST), and the Australian Eucla region (+8:45) are offset by three quarters of an hour. A local hour straddle - [Sub-hour band straddle (general)](https://etherdata.ai/blog/time-interop-kb/edge-cases/sub-hour-band-straddle): Because the canonical unit is a whole UTC hour, ANY local band whose edges do not land on a UTC hour boundary produces fractional slot membership — from sub-hou - [Spring-forward gap (nonexistent local time)](https://etherdata.ai/blog/time-interop-kb/edge-cases/spring-forward-gap): When clocks jump forward, a local wall time never occurs (e.g. 02:30 on 2026-03-08 in America/New_York). Resolving it to a slot requires a declared policy, not - [Fall-back fold (ambiguous local time)](https://etherdata.ai/blog/time-interop-kb/edge-cases/fall-back-fold): When clocks fall back, a local wall time occurs twice (e.g. 01:30 on 2026-11-01 in America/New_York), once at the pre-transition offset and once at the post-tra - [Partial-hour DST shift](https://etherdata.ai/blog/time-interop-kb/edge-cases/partial-hour-dst-shift): Not every DST change is one hour. Lord Howe Island shifts by 30 minutes (+10:30 ↔ +11:00); some historical transitions were 20 or 40 minutes. The gap or fold is - [DST transition time and date vary by zone](https://etherdata.ai/blog/time-interop-kb/edge-cases/dst-transition-time-varies): The '02:00' spring-forward is US-centric. Other zones transition at 00:00, 01:00, 03:00, or 23:00 local, on different dates, and the Southern Hemisphere transit - [Reversed (Southern Hemisphere) DST](https://etherdata.ai/blog/time-interop-kb/edge-cases/southern-hemisphere-reversed-dst): DST runs in the opposite calendar months south of the equator, and transition dates differ per country within the same offset. The same UTC slot is a different - [Non-DST region inside a DST country](https://etherdata.ai/blog/time-interop-kb/edge-cases/non-dst-region-inside-dst-country): Arizona observes no DST while the rest of US Mountain does; Queensland differs from New South Wales. A country name or a 'Mountain Time' label is ambiguous for - [Timezone-database vintage mismatch](https://etherdata.ai/blog/time-interop-kb/edge-cases/tzdb-vintage-mismatch): The IANA tz database is released roughly ten times a year for political changes. Two systems on different releases resolve the same (wall time, zone) to differe - [Political time change with short notice](https://etherdata.ai/blog/time-interop-kb/edge-cases/political-change-short-notice): Governments change offsets or DST with days of notice — Lebanon (2023), Egypt and Morocco (Ramadan DST), Samoa, Venezuela. The tzdb lags real life, so systems d - [Ambiguous zone abbreviations and bare offsets](https://etherdata.ai/blog/time-interop-kb/edge-cases/ambiguous-zone-abbreviations): 'IST' means India, Ireland, OR Israel; 'CST' means US Central, China, OR Cuba; 'EST' is used by the US and Australia. Three-letter abbreviations and bare offset - [An offset is not a zone](https://etherdata.ai/blog/time-interop-kb/edge-cases/offset-is-not-a-zone): Storing 'UTC+2' (a fixed offset) instead of 'Europe/Kyiv' (a zone) loses the DST rules, so any FUTURE wall time in that zone resolves wrong. An offset is only v - [Windows vs IANA zone ids](https://etherdata.ai/blog/time-interop-kb/edge-cases/windows-vs-iana-ids): Windows uses display names like 'Eastern Standard Time' where IANA uses 'America/New_York'; the mapping is many-to-one and requires the CLDR windowsZones table. - [Historical offset changes](https://etherdata.ai/blog/time-interop-kb/edge-cases/historical-offset-changes): Before standardization zones ran on local mean time, and countries have changed their base offset since (Samoa skipped 2011-12-30 crossing the date line; Venezu - [Competing week-numbering systems](https://etherdata.ai/blog/time-interop-kb/edge-cases/week-numbering-systems): ISO weeks start Monday; US/retail weeks often start Sunday; broadcast (Nielsen) weeks start Monday but sit inside a different month calendar; some Middle-Easter - [Week-year ≠ calendar year](https://etherdata.ai/blog/time-interop-kb/edge-cases/week-year-boundary): The ISO week-numbering year can differ from the calendar year around January 1 — 2027-01-01 belongs to 2026-W53, and 2026-12-31 can fall in the next year's W01. - [53-week years](https://etherdata.ai/blog/time-interop-kb/edge-cases/fifty-three-week-years): Some ISO years have 53 weeks (when Jan 1 is Thursday, or a leap year starts on Wednesday — e.g. 2026). Code that assumes 52 weeks misaligns year-over-year compa - [Broadcast (Nielsen) calendar month and quarter](https://etherdata.ai/blog/time-interop-kb/edge-cases/broadcast-calendar-month): The broadcast month is a whole number of broadcast weeks and does not align to the calendar month; a broadcast quarter has 13 or 14 weeks; the broadcast year bo - [Slot-origin convention](https://etherdata.ai/blog/time-interop-kb/edge-cases/slot-origin-convention): The canonical origin is slot 0 = Monday 00:00 UTC. A system that assumes a Sunday-start week is off by 24 slots; one that anchors on local midnight disagrees wi - [Broadcast-day cutover is not universal](https://etherdata.ai/blog/time-interop-kb/edge-cases/broadcast-day-cutover-varies): The broadcast day does not always start at 06:00 local — some operations use 05:00, 02:00, or midnight, and sports/overnight feeds differ. An undeclared cutover - [Naive datetime with no zone](https://etherdata.ai/blog/time-interop-kb/edge-cases/naive-datetime-no-zone): A stored '2026-03-08 02:30' with no offset and no accompanying zone cannot be resolved to a slot — and, unluckily, that particular value does not even exist in - [Local timestamps read as UTC (or vice versa)](https://etherdata.ai/blog/time-interop-kb/edge-cases/local-read-as-utc): A column stored in local time is read as UTC, or a UTC column is read as local. Every event shifts by the offset, biasing every slot systematically — the diurna - [Epoch and unit confusion](https://etherdata.ai/blog/time-interop-kb/edge-cases/epoch-and-unit-confusion): Seconds vs milliseconds vs microseconds, and non-Unix epochs (NTP 1900, Apple 2001, Windows FILETIME 1601), place events off by 1000× or in the wrong century — - [Clock skew and sentinel timestamps](https://etherdata.ai/blog/time-interop-kb/edge-cases/clock-skew-and-sentinels): Device clocks are wrong; bidstream timestamps can be in the future or negative; missing values default to 1970-01-01 (the temporal 'zero-island'); rounded value - [Timestamp rounding / truncation](https://etherdata.ai/blog/time-interop-kb/edge-cases/timestamp-rounding-truncation): Timestamps truncated to the day or hour for storage or privacy lose hour-of-week signal; a date-only value cannot be placed in a slot at all. - [Leap seconds](https://etherdata.ai/blog/time-interop-kb/edge-cases/leap-seconds): UTC has inserted 27 leap seconds since 1972, so a day is occasionally 86,401 seconds; Google and AWS 'smear' the leap second over 24 hours, disagreeing with UTC - [Date-line weekday divergence](https://etherdata.ai/blog/time-interop-kb/edge-cases/date-line-weekday-divergence): Across the International Date Line the same UTC instant is a different local weekday. Kiribati (+13/+14) and Samoa (+13) are a full day ahead of the Americas, s - [Extreme offset span (UTC−12 … +14)](https://etherdata.ai/blog/time-interop-kb/edge-cases/extreme-offset-span): The inhabited world spans 26 hours of offset, so a single local hour exists across a more-than-24-hour span of UTC instants. A local daypart aggregated across m - [UTC canonical vs local experience](https://etherdata.ai/blog/time-interop-kb/edge-cases/utc-canonical-vs-local-experience): The unit is UTC, but 'primetime', 'morning', and 'lunch' are LOCAL experiences (8pm local everywhere). Comparing behavior at the same UTC slot is not the same a - [Event vs ingestion vs report time](https://etherdata.ai/blog/time-interop-kb/edge-cases/event-vs-ingestion-vs-report-time): When something HAPPENED, when it was LOGGED, and when it is ATTRIBUTED are three different instants that fall in three different slots. Reports silently mix the - [Attribution-window time](https://etherdata.ai/blog/time-interop-kb/edge-cases/attribution-window-time): A conversion is credited to an earlier impression, so the 'slot' of a conversion depends on the attribution model — the conversion's own time, or the attributed - [No silent temporal rollup](https://etherdata.ai/blog/time-interop-kb/edge-cases/no-silent-temporal-rollup): A buyer requests hourly (slot) delivery or reporting and the platform reports at day or week grain. The temporal analog of geo's no-silent-rollup rule: coarseni - [Slot-boundary dedup and double-count](https://etherdata.ai/blog/time-interop-kb/edge-cases/slot-boundary-dedup): An event, session, or airing that spans a slot boundary can be counted in two slots or dropped — the temporal analog of geo's touching-only / duplicate eligibil - [Timezone inferred from geography](https://etherdata.ai/blog/time-interop-kb/edge-cases/inferred-timezone-from-geo): Bidstream and sensor data often lack a reliable device timezone, so it is inferred from a lat/long via a timezone-boundary shapefile — a GEO × TIME crosswalk. A - [Substitute (in-lieu) holiday days](https://etherdata.ai/blog/time-interop-kb/edge-cases/substitute-day-holidays): When a public holiday falls on a weekend, many countries observe a substitute weekday instead (UK 'bank holiday in lieu', much of APAC). The observed date is no - [Movable and regional holidays](https://etherdata.ai/blog/time-interop-kb/edge-cases/movable-and-regional-holidays): Easter-derived dates move each year (computus), lunar-calendar holidays (Eid, Diwali, Lunar New Year) shift against the Gregorian calendar, and many holidays ar - [Monotonic vs wall clock](https://etherdata.ai/blog/time-interop-kb/edge-cases/monotonic-vs-wall-clock): A monotonic clock (performance.now(), CLOCK_MONOTONIC) measures elapsed time from an arbitrary origin and has no fixed epoch, so it cannot be converted to UTC o - [Timestamp provenance (which time became canonical)](https://etherdata.ai/blog/time-interop-kb/edge-cases/timestamp-provenance): Sensor time, API time, database time, and client time are different instants. Which one became the canonical event time (and therefore the slot) is a modeling d - [Clock-accuracy metadata](https://etherdata.ai/blog/time-interop-kb/edge-cases/clock-accuracy-metadata): A GPS fix (~20 ns), a phone clock (~100 ms), and a server clock (~5 ms) are not interchangeable. Treating every timestamp as equally precise hides which slot as - [Timestamp confidence interval](https://etherdata.ai/blog/time-interop-kb/edge-cases/timestamp-confidence-interval): An instant is a point estimate plus an error bar — 12:03:10 ±150 ms, not a single moment. Near an hour boundary the ±window straddles two slots, so the assignme - [NTP synchronization state](https://etherdata.ai/blog/time-interop-kb/edge-cases/ntp-sync-state): A device whose clock is unsynchronized can be minutes off while still emitting well-formed timestamps. The format is valid; the value is not. - [VM snapshot rollback](https://etherdata.ai/blog/time-interop-kb/edge-cases/vm-snapshot-rollback): Restoring a virtual machine from a snapshot moves its clock backwards, so a later event can carry an earlier timestamp than an earlier one. - [Container / live migration](https://etherdata.ai/blog/time-interop-kb/edge-cases/container-migration): A container or VM moved between hosts inherits a different clock quality and synchronization history, so timestamp reliability changes mid-stream without any ap - [Offline capture, delayed replay](https://etherdata.ai/blog/time-interop-kb/edge-cases/offline-replay): IoT and mobile devices capture events offline and upload them later, so yesterday's events arrive today. Arrival order is not occurrence order, and late data re - [Clock-correction jumps](https://etherdata.ai/blog/time-interop-kb/edge-cases/clock-correction-jumps): After synchronization, NTP can step a clock several seconds backwards (rather than slewing), so consecutive events straddle a discontinuity and can invert in or - [Multiple clock authorities disagree](https://etherdata.ai/blog/time-interop-kb/edge-cases/multiple-clock-authorities): GPS, PTP, and NTP can disagree during outages or holdover. Which authority wins determines the timestamp, and the choice is often undocumented. - [AI-inferred timestamp](https://etherdata.ai/blog/time-interop-kb/edge-cases/ai-inferred-timestamp): A timestamp reconstructed by an LLM or by interpolation is a model output, not an observation. Treating an inferred time as measured injects unquantified error - [Synthetic event time](https://etherdata.ai/blog/time-interop-kb/edge-cases/synthetic-event-time): Simulated or generated data carries fabricated timestamps that must never masquerade as measured time, or backtests and training sets silently mix real and synt - [Embedding validity time](https://etherdata.ai/blog/time-interop-kb/edge-cases/embedding-validity-time): An embedding or feature computed months ago may no longer represent today's semantics. The datum has two times — when the event happened and when the representa - [Model training window (temporal leakage)](https://etherdata.ai/blog/time-interop-kb/edge-cases/model-training-window): A model trained on data that would not have been available at prediction time leaks the future into the past. The slot a datum belongs to is not the slot at whi - [Prediction time vs observation time](https://etherdata.ai/blog/time-interop-kb/edge-cases/prediction-vs-observation-time): A forecast generated on Monday for Friday has two times — when it was made and what it is about. Storing only one makes the forecast unauditable and mixes horiz - [Partial ordering only](https://etherdata.ai/blog/time-interop-kb/edge-cases/partial-ordering-only): Two events on different nodes cannot always be globally ordered — there may be no fact of the matter about which came first. A UTC total order imposed on them i - [Lamport / vector clocks (causal ≠ UTC order)](https://etherdata.ai/blog/time-interop-kb/edge-cases/lamport-vector-clocks): Causal order and UTC order are different relations. A can happen-before B while A's UTC timestamp is later, because of queue delay, retry, or skew. Event sourci - [Message-queue delay and reordering](https://etherdata.ai/blog/time-interop-kb/edge-cases/message-queue-delay): Kafka, SQS, and similar queues delay and reorder delivery, so arrival order at a consumer is not production order. Slotting by arrival time misplaces events. - [Duplicate event replay](https://etherdata.ai/blog/time-interop-kb/edge-cases/duplicate-event-replay): At-least-once delivery replays the same event, with an identical event timestamp but a new ingestion time. Naive counting double-counts the slot. - [Event versioning and corrections](https://etherdata.ai/blog/time-interop-kb/edge-cases/event-versioning): An event is corrected later while its original occurrence time is preserved. The correction has a new processing time but the same event time, so the slot stays - [False precision](https://etherdata.ai/blog/time-interop-kb/edge-cases/false-precision): A timestamp stored to nanoseconds from a clock accurate only to ±1 second implies precision the source never had. The extra digits are noise that can flip a nea - [Mixed-precision dataset](https://etherdata.ai/blog/time-interop-kb/edge-cases/mixed-precision-dataset): Some rows carry seconds, others milliseconds, others nanoseconds. A single numeric parse then places rows off by factors of 1000, scattering them across the wro - [Averaged timestamp](https://etherdata.ai/blog/time-interop-kb/edge-cases/averaged-timestamp): One timestamp that summarizes thousands of observations (a mean or a bucket label) is not an instant; the observations it stands for span a range and may cross - [Sampling window vs instant](https://etherdata.ai/blog/time-interop-kb/edge-cases/sampling-window): A timestamp can denote a measurement INTERVAL rather than a moment — a one-minute average, a five-minute scrape. Treating the interval as an instant drops the f - [Interval center vs start vs end](https://etherdata.ai/blog/time-interop-kb/edge-cases/interval-center-vs-start): Is a 10:00 reading the beginning, midpoint, or end of a one-hour measurement? The convention shifts every value by up to an hour and is rarely recorded. ## Structured - [kb.json](https://etherdata.ai/time-interop-kb/kb.json)