Timezone Converter
Convert a local wall-clock time using the rules for that exact date.
UTC (UTC+00:00)EDT (UTC-04:00)2026-09-04T13:54:00.000Z17885300401788530040000Timezone Conversions
Timezone FAQ
💡 Store instants in UTC
Save timestamps for completed events in UTC, then convert them to the viewer’s zone for display. For future wall-clock events, also save the intended local time and IANA zone so rule changes can be applied.
DB: UTC → Display: user’s timezone🔄 Never do timezone math yourself
Rely on libraries like date-fns-tz, luxon, or the built-in Intl APIs. Manual offset math breaks when rules change or DST flips.
❌ timestamp + (hours * 3600000)
✅ Intl.DateTimeFormat📅 Test around DST transitions
In zones with seasonal clock changes, bugs often surface near the transition. For most of the U.S. that’s the second Sunday in March (spring forward) and the first Sunday in November (fall back). Pick sample times like 01:30, 02:00, 02:30, and 03:00.
e.g. 01:59 → 03:00 on spring forward🌐 Use IANA timezone identifiers
Prefer America/New_York over EST or GMT-5. Abbreviations are ambiguous and ignore DST.
✅ America/New_York ❌ EST ❌ GMT-5⚠️ JavaScript Date() gotchas
Date-only strings like "2023-01-01" parse as midnight UTC, while date-times without an offset use the browser’s local zone. Non-standard formats vary across engines, so use ISO 8601 and include Z or an explicit offset.
2023-01-01T12:00:00Z or 2023-01-01T12:00:00-05:00🏜️ Arizona doesn’t observe DST
Most of Arizona stays on Mountain Standard Time year-round. The Navajo Nation (use America/Denver or the Navajo link) does observe DST.
America/Phoenix vs America/Denver (Navajo)🇮🇳 Not all offsets are on the hour
India (+05 : 30), Nepal (+05 : 45), Newfoundland (−03 : 30) and others use half- or quarter-hour offsets.
Asia/Kolkata → UTC+05:30❄️ Southern-hemisphere DST is opposite
In Australia, Chile, etc., DST runs roughly October → April. When the north “falls back,” the south “springs forward.”
Australia/Sydney → DST Oct – Apr🚨 Validate user timezone inputs
Ask Intl.DateTimeFormat to validate zone names.Intl.supportedValuesOf("timeZone") lists preferred IDs, but valid aliases may not appear in that list.
try { new Intl.DateTimeFormat("en", { timeZone: tz }) }
catch { throw Error("Invalid tz") }🇨🇳 Some countries ignore geography
China spans five natural zones but uses one (UTC+8). India spans two but uses one (UTC+5:30). Politics beats longitude.
Asia/Shanghai covers all of China🔄 Timezone rules change frequently
Russia scrapped seasonal DST in 2014; Turkey adopted permanent UTC+3 in 2016. Keep your tz database up-to-date.
Update tzdata every release!⏰ Handle non-existent & ambiguous times
During “spring forward” 02:30 may never occur; during “fall back” 01:30 may happen twice. When converting a wall-clock time, choose and test an explicit disambiguation policy.
Spring: 02:30 ≠ valid, Fall: 01:30 × 2🕳️ Know how leap seconds are represented
UTC has historically inserted 23 : 59 : 60, but JavaScript Date does not represent that value directly. Follow the behavior of your operating system or time service instead of trying to parse second 60.
new Date("2016-12-31T23:59:60Z") → Invalid Date🌏 When countries time-travel
Samoa skipped 30 Dec 2011 to move to the west of the International Date Line. Never assume every date exists everywhere.
Pacific/Apia: 2011-12-29 → 2011-12-31📜 Keep your runtime’s tz database current
IANA publishes several releases per year. This site uses the timezone data built into your browser, so keeping the browser current matters— especially for future dates after newly announced rule changes.
Browser Intl data → IANA timezone rules🛠️ Store the zone with the timestamp
Persisting UTC is great for ordering, but if you’ll display “exactly what the user saw,” also store the zone string.
created_at = 2025-07-12T15:04:05Z
created_at_tz = "America/Los_Angeles"Date/Time Converter
Current Time
Time Difference Calculator
Code Snippets
Get current time in a zone
new Date().toLocaleString('en-US', { timeZone: 'America/New_York' })// → 9/4/2026, 9:54:12 AM
Convert Unix timestamp
const date = new Date(1_234_567_890 * 1000) console.log(date.toISOString())// → 2009-02-13T23:31:30.000Z
Format with Intl.DateTimeFormat
new Intl.DateTimeFormat('en-US', { timeZone: 'Asia/Tokyo', year: 'numeric', month: 'long', day: 'numeric', hour: '2-digit', minute: '2-digit' }).format(new Date())// → September 4, 2026 at 10:54 PM
Get a zone’s UTC offset
const offsetFor = (date, tz) => new Intl.DateTimeFormat('en', { timeZone: tz, timeZoneName: 'longOffset' }).formatToParts(date) .find(({ type }) => type === 'timeZoneName')?.value offsetFor(new Date(), 'Europe/London')// → GMT+01:00
Get the DST-aware zone name
new Intl.DateTimeFormat('en-US', { timeZone: 'America/New_York', timeZoneName: 'long' }).formatToParts(new Date()) .find(({ type }) => type === 'timeZoneName')?.value// → Eastern Daylight Time
List primary time-zone IDs
const zones = Intl.supportedValuesOf('timeZone') console.log(zones.length + ' zones') console.log(zones.slice(0, 5))// → 418 zones, first 3: [Africa/Abidjan, Africa/Accra, Africa/Addis_Ababa …]
Relative time formatting
const rtf = new Intl.RelativeTimeFormat('en', { numeric: 'auto' }) rtf.format(-1, 'day') // "yesterday"// → yesterday
Show ISO instant in another zone
const iso = '2024-12-25T15:30:00Z' new Date(iso).toLocaleString('en-US', { timeZone: 'Europe/Paris', dateStyle: 'full', timeStyle: 'short' })// → Wednesday, December 25, 2024 at 4:30 PM
User's current time-zone
Intl.DateTimeFormat().resolvedOptions().timeZone// → America/New_York
Store UTC & original zone
const now = new Date() const record = { created_at_utc: now.toISOString(), created_at_tzid: Intl.DateTimeFormat().resolvedOptions().timeZone }// → { "created_at_utc": "2026-09-04T13:54:12.828Z", "created_at_tzid": "America/New_York" }