🌍 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.

Loading...
Timezone
Loading...
UTC Offset
Loading...
Locale
0
Languages
00:00:00
Loading...
Loading timezone...

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

Timezone (IANA)
Loading...
UTC Offset
Loading...
Timezone Abbreviation
Loading...
DST Active
Loading...
Date.getTimezoneOffset()
Loading...
Estimated Location
Loading...
Worker Consistency
Checking...

Locale & Language Settings

Primary Locale
Loading...
Language
Loading...
Country/Region
Loading...
All Languages
Loading...

Intl Formatting Examples

Date (Long)
Loading...
Time (Medium)
Loading...
Number (Decimal)
Loading...
Currency (USD)
Loading...
Relative Time
Loading...
List Format
Loading...

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);