What Is Timezone Fingerprinting? – Definition and How It Works
Learn how timezone is read from the browser, why it must agree with your egress IP, and how the mismatch is detected.
Timezone fingerprinting reads the timezone the browser reports and compares it against everything else known about the visitor — most importantly the geographic location of their IP address.
1. How Timezone Is Read
Intl.DateTimeFormat().resolvedOptions().timeZone // "Europe/Madrid" — the IANA name
new Date().getTimezoneOffset() // minutes from UTC, sign inverted
new Date().toString() // includes the zone abbreviation
The IANA name is the high-entropy one. An offset of -60 is shared by many zones; Europe/Madrid specifically is far more identifying.
2. The IP–Timezone Mismatch
This is the single most consequential check, and it is trivial to perform server-side.
The server knows the request's egress IP and can geolocate it to a country. The page reports the browser's timezone. If a request arrives from a Brazilian address while the browser reports Europe/London, those two facts disagree, and the disagreement is the signal.
Real users produce mismatches occasionally — travellers, VPN users, misconfigured machines — so it is a probabilistic signal rather than proof. But at scale, a fleet of sessions all reporting one timezone from addresses spread across many countries is unmistakable.
3. Why Proxy Rotation Makes It Worse
A collection setup rotating proxy addresses across countries while running browsers in a fixed environment produces exactly this pattern: the timezone stays constant while the apparent location moves continent to continent.
The fix is to make the browser environment follow the proxy:
context = browser.new_context(
proxy={"server": proxy_url},
timezone_id="America/Sao_Paulo", # match the exit's country
locale="pt-BR",
geolocation={"latitude": -23.55, "longitude": -46.63},
permissions=["geolocation"],
)
The pairing must be maintained as a unit — exit country, timezone, locale, and (where granted) geolocation. Setting one and not the others substitutes one contradiction for another.
4. What Else Must Agree
Timezone sits inside a cluster of location-adjacent signals that are all cross-checked:
| Signal | Must be consistent with |
|---|---|
Intl timezone |
Egress IP country |
Accept-Language header |
navigator.languages |
navigator.languages |
Timezone region, loosely |
| Geolocation API result | IP location, if permission granted |
| Currency and number formatting | Locale |
A Spanish IP with Europe/Madrid, es-ES language, and Spanish number formatting is coherent. Any one of those flipped to a US value is a discrepancy.
5. Daylight Saving Is a Detail That Catches Fakes
A spoofed offset that ignores daylight saving is detectable, because the correct offset for a given IANA zone on a given date is knowable.
// For a real Europe/Madrid browser these differ across the DST boundary
new Date('2026-01-15T12:00:00Z').getTimezoneOffset() // -60
new Date('2026-07-15T12:00:00Z').getTimezoneOffset() // -120
Using a proper IANA zone identifier rather than a fixed numeric offset handles this automatically — which is a good reason to configure timezone_id rather than patching offsets.
6. Where It Also Affects Your Data
Beyond detection, timezone changes what a site shows you: relative timestamps, business hours, delivery estimates, event times, and scheduling availability all render in the visitor's zone.
So an unpinned timezone means collected timestamps are interpreted against whatever zone the environment happened to have — a silent data-quality problem separate from any detection concern. Pin it, and record it alongside the data.
7. Practical Rules
- Pin the timezone explicitly on every context; never inherit the host's.
- Match it to the proxy exit country, and treat that as one bundled decision.
- Set locale and language to match, in both headers and JavaScript.
- Use IANA zone names, not fixed offsets, so DST is correct.
- Record the timezone with the data, since it affects rendered timestamps.
- Do not grant geolocation permission unless needed — an ungranted permission reveals nothing, while a granted one that contradicts the IP reveals a lot.
8. Summary
Timezone fingerprinting reads the browser's IANA timezone and offset and cross-checks them against the egress IP's geography, the language headers, and locale formatting.
Rotating proxies across countries with a fixed browser environment produces a constant timezone against a moving apparent location, which is the pattern to avoid — so bundle exit country, timezone, locale, and geolocation as one coherent unit, use IANA names so daylight saving is right, and record the timezone because it changes the timestamps a site renders.