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.
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.
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:
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:
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
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):
| Cell | Contains |
|---|---|
| UTC input | 2026-01-15T23:00:00Z |
| EST output | 2026-01-15, 18:00:00 (EST) |
Daylight time (July):
| Cell | Contains |
|---|---|
| UTC input | 2026-07-15T23:00:00Z |
| EDT output | 2026-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.
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
| Cell | Contains |
|---|---|
| UTC input | 2026-01-16T03:00:00Z |
| EST output | 2026-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 — theIntlAPI expects an IANA zone name like'America/New_York', not a US zone abbreviation;'EST'is not a validtimeZonevalue. - Parsing a timestamp string with no
Zor 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 withoutZunder differentTZsettings: 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.
Related tools
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.