UTC to EST in JavaScript

Convert a UTC Date to US Eastern Time using JavaScript's built-in Intl API — no library required, and correct on every date, including through daylight saving.

UTC → TIME ZONE Live
RESULT — US Eastern Time
12:55:41
Monday, September 21, 2026
UTC offset: UTC−4
Zone: EDT

Use this live converter to check a value before wiring up the code below.

Quick answer

Pass the IANA zone name 'America/New_York' as the timeZone option — works identically in the browser and in Node.js, since both use the same Intl engine.

JavaScript — UTC to EST
const utcStandard = new Date('2026-01-15T23:00:00Z'); // Jan -- standard time const utcDaylight = new Date('2026-07-15T23:00:00Z'); // Jul -- daylight time const fmt = { timeZone: 'America/New_York', year:'numeric', month:'2-digit', day:'2-digit', hour:'2-digit', minute:'2-digit', second:'2-digit', hour12:false }; console.log(utcStandard.toLocaleString('en-CA', fmt)); // 2026-01-15, 18:00:00 (EST) console.log(utcDaylight.toLocaleString('en-CA', fmt)); // 2026-07-15, 19:00:00 (EDT)

Reusable function

Wrap it once and reuse it for any UTC string and target zone:

JavaScript — reusable converter
function convertUtcToZone(utcIsoString, timeZone) { const d = new Date(utcIsoString); const parts = new Intl.DateTimeFormat('en-CA', { timeZone, year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false }).formatToParts(d); const get = (type) => parts.find(p => p.type === type).value; return `${get('year')}-${get('month')}-${get('day')} ${get('hour')}:${get('minute')}:${get('second')}`; } convertUtcToZone('2026-01-15T23:00:00Z', 'America/New_York'); // '2026-01-15 18:00:00' (EST) convertUtcToZone('2026-07-15T23:00:00Z', 'America/New_York'); // '2026-07-15 19:00:00' (EDT)

Getting "EST" or "EDT" as text

If you need to display which one currently applies, rather than just the numbers:

JavaScript — zone abbreviation
function getZoneAbbreviation(utcIsoString, timeZone) { const d = new Date(utcIsoString); const parts = new Intl.DateTimeFormat('en-US', { timeZone, timeZoneName: 'short' }).formatToParts(d); return parts.find(p => p.type === 'timeZoneName').value; } getZoneAbbreviation('2026-01-15T23:00:00Z', 'America/New_York'); // 'EST' getZoneAbbreviation('2026-07-15T23:00:00Z', 'America/New_York'); // 'EDT'

Converting the current UTC time

JavaScript — current time
const nowInEastern = new Date().toLocaleString('en-CA', { timeZone: 'America/New_York', year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false }); // resolves to EST or EDT automatically, based on today's date

Worked example

Standard time (January):

CellContains
UTC input2026-01-15T23:00:00Z
EST output2026-01-15, 18:00:00 (EST)

Daylight time (July):

CellContains
UTC input2026-07-15T23:00:00Z
EDT output2026-07-15, 19:00:00 (EDT)

Date rollover example

A conversion that crosses midnight shows the correct new calendar date automatically, since Date and Intl always operate on the full instant, not just a time-of-day.

JavaScript — date rollover
const utc = new Date('2026-01-16T03:00:00Z'); console.log( utc.toLocaleString('en-CA', { timeZone: 'America/New_York', year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', hour12: false }) ); // 2026-01-15, 22:00 -- one calendar day behind the UTC date
CellContains
UTC input2026-01-16T03:00:00Z
EST output2026-01-15, 22:00

Time zone and daylight saving

2026 transition dates: US clocks move to daylight time on March 8, 2026 and back to standard time on November 1, 2026. Because 'America/New_York' is a named IANA zone, every example above resolves EST or EDT automatically for the date given — that's the reason to prefer it over a hardcoded offset.

Common mistakes

  • Treating EST as a permanent UTC−5 offset — for roughly eight months of the year the correct zone is actually EDT (UTC−4); code that hardcodes −5 will be an hour off for that whole stretch.
  • Passing the literal string 'EST' as a JavaScript time zone identifier — the Intl API expects an IANA zone name like 'America/New_York', not a US zone abbreviation; 'EST' is not a valid timeZone value.
  • Parsing a timestamp string with no Z or offset suffix and assuming it's UTC — it's parsed as local time in whatever time zone the code is running in (confirmed by running the same string with and without Z under different TZ settings: a 5-hour difference appeared with no other change).
  • Treating a value already converted to Eastern time as if it were still UTC when doing further date math — keep the original UTC value around for any calculation, and only convert for display.

Browser and Node.js

Every example above runs unchanged in a browser and in Node.js (v13 and later ship the full ICU/timezone database by default) — no moment-timezone, date-fns-tz, or other library is required. A library can still be worth adding in a larger app for convenience, but it's optional here, not a requirement for correct conversion.

Frequently asked questions

Use Intl.DateTimeFormat or Date.prototype.toLocaleString with timeZone: 'America/New_York' — no library needed.

Yes — the native Intl API (available in every modern browser and in Node.js) handles it directly via the 'America/New_York' IANA zone name.

Yes, as long as you pass the IANA zone name 'America/New_York' rather than a fixed offset or the literal string 'EST' — the Intl API resolves EST or EDT correctly based on the date.