🌍 Timezone & Intl Detector
Detect your browser's timezone, locale, and internationalization settings. Understand how timezone reveals your location and the privacy implications of Intl APIs.
Privacy Warning: Timezone = Location
Your timezone reveals your approximate location with ~15-minute precision. Combined with other fingerprinting data, it can identify your city or region. VPN users should ensure their timezone matches their VPN location to avoid detection.
Timezone Details
Locale & Language Settings
Intl Formatting Examples
What is Timezone Fingerprinting?
Timezone fingerprinting uses your browser's timezone and locale settings to estimate your geographic location and create a unique identifier:
How Timezone Reveals Location
- IANA Timezone - "America/New_York" reveals you're in Eastern Time
- UTC Offset - UTC-5:00 narrows down to specific time zones
- DST Detection - Daylight Saving Time patterns reveal country/region
- Offset Changes - Timezone offset changes reveal when DST starts/ends
Privacy Implications
Your timezone is one of the most revealing pieces of fingerprinting data because:
- It's extremely stable - users rarely change their timezone
- It's precise - narrows location to ~15-minute longitude slice
- It's easy to detect - exposed via JavaScript Date API
- It reveals VPN misconfigurations - timezone doesn't match VPN location
// Detect user timezone
const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
console.log('Timezone:', timezone); // "America/Los_Angeles"
// Get UTC offset (in minutes)
const offset = new Date().getTimezoneOffset();
console.log('UTC offset:', -offset / 60); // -8 (PST)
// Detect DST
const jan = new Date(2024, 0, 1).getTimezoneOffset();
const jul = new Date(2024, 6, 1).getTimezoneOffset();
const isDST = Math.max(jan, jul) !== new Date().getTimezoneOffset();
console.log('DST active:', isDST);Intl API Fingerprinting
The Intl (Internationalization) API provides locale-specific formatting that reveals cultural and regional preferences:
Locale Detection
// Get user locale
const locale = Intl.DateTimeFormat().resolvedOptions().locale;
console.log('Locale:', locale); // "en-US", "fr-FR", "ja-JP"
// Get all preferred languages
const languages = navigator.languages;
console.log('Languages:', languages); // ["en-US", "en", "es"]Formatting Reveals Culture
How you format dates, numbers, and currency reveals your region:
- Date Format
- US: "12/31/2024" (MM/DD/YYYY)
- EU: "31/12/2024" (DD/MM/YYYY)
- ISO: "2024-12-31" (YYYY-MM-DD)
- Number Format
- US/UK: "1,234.56" (comma thousands, period decimal)
- EU: "1.234,56" (period thousands, comma decimal)
- India: "1,23,456.78" (lakh system)
- Currency
- US: "$1,234.56"
- EU: "1 234,56 €"
- Japan: "¥1,234"
// Format examples revealing culture
const num = 1234567.89;
// US formatting
new Intl.NumberFormat('en-US').format(num);
// "1,234,567.89"
// German formatting
new Intl.NumberFormat('de-DE').format(num);
// "1.234.567,89"
// Currency formatting
new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'USD'
}).format(123.45);
// "$123.45"How to Spoof Timezone
If you're using a VPN or want to hide your location, you must spoof your timezone:
1. Browser Extension (Easiest)
Use extensions like "Timezone Shifter" or "Chameleon" to override timezone.
2. JavaScript Spoofing (Automation)
// Spoof Intl.DateTimeFormat
const originalDateTimeFormat = Intl.DateTimeFormat;
Intl.DateTimeFormat = function(locales, options) {
// Force specific timezone
const opts = { ...options, timeZone: 'America/New_York' };
return new originalDateTimeFormat(locales, opts);
};
// Spoof Date.getTimezoneOffset
const originalGetTimezoneOffset = Date.prototype.getTimezoneOffset;
Date.prototype.getTimezoneOffset = function() {
// Return offset for New York (UTC-5 or UTC-4)
return 300; // 300 minutes = UTC-5
};3. Browser Launch Arguments (Puppeteer/Playwright)
// Puppeteer example
const browser = await puppeteer.launch({
args: ['--timezone=America/New_York']
});
// Playwright example
const browser = await chromium.launch({
env: {
TZ: 'America/New_York'
}
});4. Use Scrapfly API (Recommended)
Scrapfly automatically handles timezone spoofing to match your proxy location:
from scrapfly import ScrapflyClient, ScrapeConfig
client = ScrapflyClient(key='YOUR_KEY')
result = client.scrape(ScrapeConfig(
url='https://example.com',
country='US', # Scrapfly auto-sets timezone to match US location
asp=True,
render_js=True
))Detecting Timezone (JavaScript)
Complete code to detect and analyze timezone in your applications:
// Get comprehensive timezone information
function getTimezoneInfo() {
const date = new Date();
const dtf = Intl.DateTimeFormat();
const resolved = dtf.resolvedOptions();
// Detect DST
const jan = new Date(date.getFullYear(), 0, 1).getTimezoneOffset();
const jul = new Date(date.getFullYear(), 6, 1).getTimezoneOffset();
const isDST = Math.max(jan, jul) !== date.getTimezoneOffset();
return {
// IANA timezone
timezone: resolved.timeZone, // "America/New_York"
// UTC offset
offsetMinutes: -date.getTimezoneOffset(),
offsetHours: -date.getTimezoneOffset() / 60,
offsetString: formatOffset(-date.getTimezoneOffset()),
// Locale info
locale: resolved.locale,
language: navigator.language,
languages: navigator.languages,
// DST info
isDST: isDST,
// Formatting
dateFormat: dtf.format(date),
timeFormat: new Intl.DateTimeFormat(resolved.locale, {
hour: 'numeric',
minute: 'numeric',
second: 'numeric'
}).format(date)
};
}
function formatOffset(minutes) {
const hours = Math.floor(Math.abs(minutes) / 60);
const mins = Math.abs(minutes) % 60;
const sign = minutes >= 0 ? '+' : '-';
return `UTC${sign}${hours}:${mins.toString().padStart(2, '0')}`;
}
// Usage
const tzInfo = getTimezoneInfo();
console.log('Timezone Info:', tzInfo);