Timezone Converter

Convert a local wall-clock time using the rules for that exact date.

Converted time
Fri, Sep 4, 2026, 09:54:00
SourceUTC (UTC+00:00)
DestinationEDT (UTC-04:00)
ISO 8601 UTC2026-09-04T13:54:00.000Z
Unix seconds1788530040
Unix milliseconds1788530040000

Timezone Conversions

UTC
Fri, Sep 4, 2026, 16:00:00
UTC (UTC+00:00)
Eastern (New York)
Fri, Sep 4, 2026, 12:00:00
EDT (UTC-04:00)
London
Fri, Sep 4, 2026, 17:00:00
GMT+1 (UTC+01:00)
Tokyo
Sat, Sep 5, 2026, 01:00:00
GMT+9 (UTC+09:00)

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

Date.now():
1788537600000
ISO String:
2026-09-04T16:00:00.000Z
Local Time:
Fri Sep 04 2026 12:00:00 GMT-0400 (Eastern Daylight Time)

Time Difference Calculator

13 hours difference
New_York: Fri, Sep 4, 2026, 12:00:00
Tokyo: Sat, Sep 5, 2026, 01:00:00

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" }