UTC to IST in JavaScript
Convert a UTC Date to India Standard Time using JavaScript's built-in Intl API — no library required, and correct on every date the year round.
Use this live converter to check a value before wiring up the code below.
Quick answer
Pass the IANA zone name 'Asia/Kolkata' as the timeZone option — works identically in the browser and in Node.js, since both use the same Intl engine.
const utcDate = new Date('2026-01-16T03:00:00Z');
const formatted = utcDate.toLocaleString('en-CA', {
timeZone: 'Asia/Kolkata',
year: 'numeric', month: '2-digit', day: '2-digit',
hour: '2-digit', minute: '2-digit', second: '2-digit',
hour12: false
});
console.log(formatted); // 2026-01-16, 08:30:00
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-16T03:00:00Z', 'Asia/Kolkata'); // '2026-01-16 08:30:00'
Converting the current UTC time
const nowInIst = new Date().toLocaleString('en-CA', {
timeZone: 'Asia/Kolkata',
year: 'numeric', month: '2-digit', day: '2-digit',
hour: '2-digit', minute: '2-digit', second: '2-digit',
hour12: false
});
Worked example
| Cell | Contains |
|---|---|
| UTC input | 2026-01-16T03:00:00Z |
| IST output | 2026-01-16, 08:30:00 |
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-09-17T23:00:00Z');
console.log(
utc.toLocaleString('en-CA', {
timeZone: 'Asia/Kolkata',
year: 'numeric', month: '2-digit', day: '2-digit',
hour: '2-digit', minute: '2-digit', hour12: false
})
); // 2026-09-18, 04:30 -- one calendar day ahead of the UTC date
| Cell | Contains |
|---|---|
| UTC input | 2026-09-17T23:00:00Z |
| IST output | 2026-09-18, 04:30 |
Time zone and daylight saving
India Standard Time does not observe daylight saving, so Asia/Kolkata always resolves to the same UTC+5:30 offset — there's no standard/daylight distinction to handle.
Common mistakes
- Assuming the visitor's browser is already set to IST —
new Date().toString()prints the browser's local time zone, which is only IST if the visitor happens to be in one. - Manually adding 5.5 hours to a UTC
Dateinstead of usingtimeZone: 'Asia/Kolkata'— it produces the same result for IST specifically, but breaks silently the moment the same code is reused for a timezone that has daylight saving. - Parsing a timestamp string with no
Zor offset suffix (e.g.'2026-01-16T03:00:00') and assuming it's UTC — JavaScript parses it as local time in whatever time zone the code is running in, which silently shifts the value.
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: 'Asia/Kolkata' — no library needed.
Yes — the native Intl API (available in every modern browser and in Node.js) handles it directly via the 'Asia/Kolkata' IANA zone name.
No — India Standard Time has a fixed UTC+5:30 offset year-round, so the same code returns a consistent result on every date.