Sources

Every factual claim the tools on this site make comes from somewhere you can go and check for yourself. This page names those places, says what each one is used for, and gives the version in use wherever a source has versions.

Almost none of this data is ours. Every count below was measured against the committed file it describes, rather than copied out of a specification — a distinction that earned itself here, since four of the assertions our own spec made about this data turned out to be wrong when they were first run against it.

Time zone rules

IANA Time Zone Database

The IANA Time Zone Database is the authoritative record of civil time worldwide — which places changed their clocks, when, and by how much. It is public domain, and it is what operating systems and browsers run on.

One point about it matters more here than the licence. The tools on this site ship no copy of these rules. They read them from your own device, through the internationalisation interfaces every modern browser exposes — so the rules behind a conversion are as current as your browser and operating system, and a stale copy on your device is something this site inherits and cannot detect. What it can do is show what has moved recently: time zone changes.

The tzdb files vendored into this site

The city list is the exception, because no platform interface maps a zone to a country. That join exists in one file and nowhere else, so four files from tzdata 2026c are committed alongside the code:

  • zone1970.tab312 zones, and the only source anywhere for the zone-to-country join.
  • iso3166.tab249 country codes and their English names.
  • backward256 alias records mapping retired zone names to current ones, so a city filed under Europe/Oslo or Asia/Kuala_Lumpuris stored under the identifier tzdb uses today.
  • version — the release’s own version file, which is where the2026c above comes from. We do not label the release ourselves.

tzdb release notes

NEWS is the database's own changelog: every release and every rule change, in the maintainers' words. Rule changes are sourced to it directly on time zone changes, and quoted from it wherever the notes state the change in a sentence — because a paraphrase of a rule change is a new claim needing its own source, and this site has already published one wrong date that way.

Place names and city data

GeoNames

The cities behind the zone picker in the time zone converter come from GeoNames — the cities15000 dump, every settlement over 15,000 people. It held 34,080 rows when retrieved, of which1,446 are in the shipped table. The other 54 of that table’s 1,500 rows are not GeoNames data at all: they are synthesised from zone1970.tab and CLDR for the zones GeoNames cannot reach — Antarctic research stations, uninhabited island territories and the like, where there is no settlement over 15,000 people to name. Every one is flagged in the data, so a synthesised place can always be told from a real one.

Two territories are in neither group and are worth naming, because they are the reason the country count is 247 rather than 249. Bouvet Island andHeard & McDonald Islands carry ISO codes but appear in no row ofzone1970.tab — IANA places no time zone for either, both being uninhabited. There is therefore nothing to synthesise from, and inventing an offset would mean this site asserting a fact the database declines to state. So they are absent, and the count is recomputed from the source files on every build rather than written down: the day IANA places a zone for either, the check fails and the row has to ship.

GeoNames is licensed under CC BY 4.0, which asks three things together: credit the source, link the licence, and say the material was changed.The city list is a modified subset: we select, re-rank and add to the source data. That is a licence obligation rather than a courtesy, and the full account of those changes ships with the code.

Unicode CLDR

CLDR, version 48.2.0, under the Unicode licence. It supplies country display names and the exemplar city that labels each zone. Those names come from a pinned release rather than from the browser at page load, because they move between releases — CLDR 43 changed one country's English name from Turkey to Türkiye — and two visitors would otherwise read different words off the same control.

Why a zone is labelled by its exemplar city, not its largest

Worth publishing, because it looks like a mistake. The first version of the generator labelled each zone with its highest-ranked city, which rendered America/New_York asWashington: the ranking awards a bonus for a capital, and it outweighed New York's population. Correct by the formula, wrong for the job. CLDR's exemplar city agrees with the zone identifier by construction — Asia/Kolkata is Kolkata rather than Mumbai,Asia/Bangkok is Bangkok rather than Hanoi.

Why Hanoi sits in Asia/Bangkok

zone1970.tab splits Vietnam — Asia/Bangkok for the north,Asia/Ho_Chi_Minh for the south — because the two ran different offsets before 1975. It looks like a data error, is not one, and is why a zone can never be inferred from a country code.

Web platform behaviour

A browser is not a neutral stage for a timer: it slows and suspends pages you are not looking at. That is why the stopwatch, the timer andthe pomodoro timer recompute from stored instants instead of counting ticks.

  • MDN — setTimeout — background-tab clamping. Firefox on the desktop enforces a one-second minimum in an inactive tab; Firefox for Android clamps to fifteen minutes and may unload the page.
  • Chrome — timer throttling — hidden tabs are throttled to once per second, and to once per minute under intensive throttling.
  • MDN — requestAnimationFramepaused in background tabs, not merely throttled. A readout drawn on animation frames stops dead — harmless if the number is derived, a disaster if accumulated.
  • MDN — Performance.timeOrigin — the high-resolution timer is measured from the moment the page was created, so a reading saved before a reload refers to an origin that no longer exists.
  • MDN — input type="date" — a date field displays in the browser's own locale, with no way to influence that, but its value is always yyyy-mm-dd. Confusing the two is how date tools corrupt data.

Accessibility

The standard is WCAG 2.2. Four criteria do most of the work here:

  • 2.2.2 Pause, Stop, Hide — it applies to auto-updating information, not only to things that move, blink or scroll. A ticking clock is in scope and needs a way to stop it.
  • 1.4.3 Contrast (Minimum) — text against its background.
  • 1.4.11 Non-text Contrast — input borders, focus rings, the edges of controls. Lighthouse’s automated audit does not check this one, so it is asserted here by unit test instead.
  • 3.1.2 Language of Parts — a phrase in another language inside an English page has to say so, or a screen reader pronounces it wrongly.

Standards and reference implementations

ECMAScript and the Temporal proposal

Temporal is the date and time interface being added to JavaScript — Stage 4 at TC39, and listed for ES2027 in the committee'sfinished-proposals register. This site does not ship it — it is not yet in every browser — but the calendar arithmetic here is written to match Temporal's conventions and is tested against a real implementation. That is a product requirement rather than a matter of purity: people cross-check an answer against another site, and two tools disagreeing about how many whole months lie between 31 January and 28 February is indistinguishable from one of them being broken.

Leap seconds

Resolution 4 of the 27th CGPM, adopted in 2022. It is widely reported as abolishing the leap second, and that is not what it says: it decided that the maximum permitted difference between UT1 and UTC will be increasedin, or before, 2035. The last leap second was inserted on31 December 2016. It matters here because JavaScript ignores leap seconds altogether — every day is exactly 86,400,000 milliseconds long, a simplification these tools inherit and state.

RFC 3986

RFC 3986 section 3.5 defines the URL fragment — everything after the hash — and establishes that it is not sent as part of the HTTP request. Share links on this site carry their whole state in the fragment for exactly that reason, so the contents of a link you share never reach this site’s server or its logs. That is a claim about the network, not a general privacy guarantee: code running in the page can read the fragment, and when advertising is enabled Google’s tag can read the address of the page it is on.

How to check us

Every vendored file is recorded with its release, its retrieval date and its SHA-256 checksum. The city table is generated from those files by a script that refuses to write a table failing its own assertions, and regenerating it from the same inputs produces a byte-identical file — so the table is demonstrably a function of its sources, not something hand-edited into shape.

One figure above deliberately will not reproduce: the GeoNames dump is rebuilt daily and no dated archive is kept, so a fresh download matches neither the checksum nor the 34,080-row count. The committed copy is what makes the derivation reproducible at all.

How these claims are tested is set out on accuracy. If something here is wrong — a version that has moved, a count that no longer holds — tell us viacontact. A correction with a primary source attached is the kind we can act on fastest, because checking it is a matter of opening the source rather than reconstructing an argument.