Пошук уроків, статей та іншого контенту
Освоїте Intl.DateTimeFormat для локалізованого виведення дат, часу, часових зон і календарних компонентів.
Intl.DateTimeFormatIntl.DateTimeFormat — це вбудований API JavaScript для форматування дат і часу відповідно до локалі користувача.
За його допомогою можна:
виводити назви місяців і днів тижня потрібною мовою;
форматувати дату в різних стилях;
показувати час у конкретному часовому поясі;
використовувати 12- або 24-годинний формат;
форматувати окремі частини дати;
працювати з календарями, наприклад григоріанським або японським;
форматувати діапазони дат.
На відміну від ручного складання рядка через getDate(), getMonth() і getFullYear(), Intl.DateTimeFormat враховує правила конкретної локалі.
const date = new Date("2026-07-26T15:30:00Z");
const formatter = new Intl.DateTimeFormat("uk-UA", {
dateStyle: "full",
timeStyle: "short",
timeZone: "Europe/Kyiv"
});
console.log(formatter.format(date));
// Приклад результату:
// неділя, 26 липня 2026 р. о 18:30Результат може дещо відрізнятися залежно від версії середовища JavaScript та його бази локалізації.
Конструктор має такий вигляд:
new Intl.DateTimeFormat(locales, options)localesПараметр locales визначає мову та регіон.
const date = new Date("2026-07-26T15:30:00Z");
console.log(new Intl.DateTimeFormat("uk-UA").format(date));
console.log(new Intl.DateTimeFormat("en-US").format(date));
console.log(new Intl.DateTimeFormat("de-DE").format(date));Можна передати масив локалей. У такому разі середовище вибере першу підтримувану локаль:
const formatter = new Intl.DateTimeFormat([
"uk-UA",
"pl-PL",
"en-US"
]);
console.log(formatter.format(new Date()));Якщо локаль не вказати, буде використано локаль за замовчуванням у середовищі виконання:
const formatter = new Intl.DateTimeFormat();У вебзастосунках локаль часто беруть із налаштувань користувача або браузера:
const formatter = new Intl.DateTimeFormat(
navigator.languages,
{ dateStyle: "long" }
);optionsДругий параметр визначає, які компоненти дати та часу потрібно показати.
const date = new Date("2026-07-26T15:30:45Z");
const formatter = new Intl.DateTimeFormat("uk-UA", {
year: "numeric",
month: "long",
day: "numeric",
hour: "2-digit",
minute: "2-digit"
});
console.log(formatter.format(date));Для дати доступні такі основні опції:
weekday — день тижня;
era — ера;
year — рік;
month — місяць;
day — день місяця.
Опція year може мати такі значення:
"numeric" — повне числове представлення;
"2-digit" — дві останні цифри року.
const date = new Date("2026-07-26T15:30:00Z");
console.log(new Intl.DateTimeFormat("uk-UA", {
year: "numeric"
}).format(date));
console.log(new Intl.DateTimeFormat("uk-UA", {
year: "2-digit"
}).format(date));Для month доступні значення:
"numeric" — номер місяця без обов’язкового початкового нуля;
"2-digit" — номер місяця з двома цифрами;
"long" — повна назва місяця;
"short" — скорочена назва;
"narrow" — найкоротше представлення, зазвичай одна літера.
const date = new Date("2026-07-26T15:30:00Z");
for (const month of [
"numeric",
"2-digit",
"long",
"short",
"narrow"
]) {
const formatter = new Intl.DateTimeFormat("uk-UA", {
month
});
console.log(month, formatter.format(date));
}const date = new Date("2026-07-26T15:30:00Z");
const formatter = new Intl.DateTimeFormat("uk-UA", {
weekday: "long",
day: "numeric",
month: "long",
year: "numeric"
});
console.log(formatter.format(date));
// неділя, 26 липня 2026 р.Для weekday доступні:
"long" — повна назва;
"short" — скорочена назва;
"narrow" — коротке представлення.
Для часу використовують такі опції:
hour;
minute;
second;
fractionalSecondDigits;
dayPeriod;
timeZoneName.
const date = new Date("2026-07-26T15:30:45.123Z");
const formatter = new Intl.DateTimeFormat("uk-UA", {
hour: "2-digit",
minute: "2-digit",
second: "2-digit",
fractionalSecondDigits: 3,
timeZone: "UTC"
});
console.log(formatter.format(date));fractionalSecondDigits може мати значення від 1 до 3 і визначає кількість цифр дробової частини секунди.
Поведінка формату годин залежить від локалі. Щоб явно попросити 12- або 24-годинне представлення, можна використати hour12.
const date = new Date("2026-07-26T15:30:00Z");
const twelveHourFormatter = new Intl.DateTimeFormat("en-US", {
hour: "numeric",
minute: "2-digit",
hour12: true,
timeZone: "UTC"
});
const twentyFourHourFormatter = new Intl.DateTimeFormat("uk-UA", {
hour: "2-digit",
minute: "2-digit",
hour12: false,
timeZone: "UTC"
});
console.log(twelveHourFormatter.format(date));
console.log(twentyFourHourFormatter.format(date));Також існує опція hourCycle, яка дає точніший контроль над циклом годин:
"h11";
"h12";
"h23";
"h24".
У більшості випадків достатньо hour12.
Опція dayPeriod може показувати локалізовану назву частини дня. Вона підтримує значення "narrow", "short" і "long".
const date = new Date("2026-07-26T15:30:00Z");
const formatter = new Intl.DateTimeFormat("en-US", {
hour: "numeric",
dayPeriod: "long",
timeZone: "UTC"
});
console.log(formatter.format(date));Підтримка та вигляд таких назв залежать від локалі.
Замість окремого переліку компонентів можна використати:
dateStyle: "full", "long", "medium" або "short";
timeStyle: "full", "long", "medium" або "short".
const date = new Date("2026-07-26T15:30:45Z");
const styles = ["full", "long", "medium", "short"];
for (const dateStyle of styles) {
const formatter = new Intl.DateTimeFormat("uk-UA", {
dateStyle,
timeZone: "UTC"
});
console.log(dateStyle, formatter.format(date));
}Приклад із датою та часом:
const formatter = new Intl.DateTimeFormat("uk-UA", {
dateStyle: "long",
timeStyle: "short",
timeZone: "Europe/Kyiv"
});
console.log(formatter.format(new Date("2026-07-26T15:30:00Z")));Не слід одночасно використовувати dateStyle або timeStyle і окремі опції компонентів.
// Неправильно: не поєднуйте dateStyle з year або month.
new Intl.DateTimeFormat("uk-UA", {
dateStyle: "long",
year: "numeric"
});Об’єкт Date зберігає момент часу, а не окрему часову зону. Часова зона використовується під час перетворення цього моменту у форматований рядок.
Часову зону можна вказати через timeZone:
const instant = new Date("2026-07-26T15:30:00Z");
const zones = [
"UTC",
"Europe/Kyiv",
"America/New_York",
"Asia/Tokyo"
];
for (const timeZone of zones) {
const formatter = new Intl.DateTimeFormat("uk-UA", {
dateStyle: "full",
timeStyle: "short",
timeZone
});
console.log(`${timeZone}: ${formatter.format(instant)}`);
}"Z" у рядку "2026-07-26T15:30:00Z" означає UTC. Один і той самий момент часу матиме різний локальний час у різних часових зонах.
Поширені ідентифікатори часових зон:
"UTC";
"Europe/Kyiv";
"Europe/London";
"America/New_York";
"Asia/Tokyo".
Використовуйте ідентифікатори IANA, а не самостійно обчислюйте зміщення на кшталт UTC+2. Правила переходу на літній і зимовий час можуть змінюватися протягом року.
Якщо timeZone не вказано, використовується часова зона середовища виконання. У браузері це зазвичай часова зона пристрою користувача.
Її можна отримати так:
const userTimeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;
console.log(userTimeZone);Для серверного застосунку це може бути часова зона сервера, тому не варто припускати, що вона збігається з часовою зоною користувача.
Щоб додати до результату назву або зміщення часової зони, використовуйте timeZoneName:
const date = new Date("2026-07-26T15:30:00Z");
const formatter = new Intl.DateTimeFormat("uk-UA", {
dateStyle: "medium",
timeStyle: "short",
timeZoneName: "short",
timeZone: "Europe/Kyiv"
});
console.log(formatter.format(date));Можливі значення timeZoneName включають:
"short";
"long";
"shortOffset";
"longOffset";
"shortGeneric";
"longGeneric".
Точний текст залежить від локалі та конкретної часової зони.
Intl.DateTimeFormat підтримує різні календарі. Календар можна вказати через опцію calendar або через розширення локалі.
const date = new Date("2026-07-26T15:30:00Z");
const gregorian = new Intl.DateTimeFormat("uk-UA", {
dateStyle: "long",
calendar: "gregory",
timeZone: "UTC"
});
const japanese = new Intl.DateTimeFormat("ja-JP", {
dateStyle: "long",
calendar: "japanese",
timeZone: "UTC"
});
console.log(gregorian.format(date));
console.log(japanese.format(date));Поширені ідентифікатори календарів:
"gregory" — григоріанський;
"japanese" — японський;
"buddhist" — буддійський;
"islamic" — ісламський;
"hebrew" — єврейський.
Календар змінює представлення компонентів дати, але не змінює сам момент часу.
Для деяких локалей можна вказати систему числення через numberingSystem.
const date = new Date("2026-07-26T15:30:00Z");
const formatter = new Intl.DateTimeFormat("ar-EG", {
dateStyle: "long",
numberingSystem: "arab",
timeZone: "UTC"
});
console.log(formatter.format(date));Також параметр можна передати в локалі:
const formatter = new Intl.DateTimeFormat("ar-EG-u-nu-arab", {
dateStyle: "long",
timeZone: "UTC"
});Розширення -u- у BCP 47-тезі локалі дозволяє задавати додаткові параметри, зокрема календар і систему числення.
formatToPartsМетод format() повертає готовий рядок. Якщо потрібно самостійно керувати HTML-розміткою або стилями окремих частин, використовуйте formatToParts().
const date = new Date("2026-07-26T15:30:45Z");
const formatter = new Intl.DateTimeFormat("uk-UA", {
weekday: "long",
year: "numeric",
month: "long",
day: "numeric",
hour: "2-digit",
minute: "2-digit",
timeZone: "UTC"
});
const parts = formatter.formatToParts(date);
console.log(parts);Метод повертає масив об’єктів із властивостями type і value:
[
{ type: "weekday", value: "неділя" },
{ type: "literal", value: ", " },
{ type: "day", value: "26" }
// ...
]Можна знайти окрему частину:
const dayPart = parts.find(part => part.type === "day");
const monthPart = parts.find(part => part.type === "month");
console.log(dayPart?.value);
console.log(monthPart?.value);Приклад побудови HTML:
const parts = new Intl.DateTimeFormat("uk-UA", {
day: "numeric",
month: "long",
year: "numeric",
timeZone: "UTC"
}).formatToParts(new Date("2026-07-26T15:30:00Z"));
const html = parts.map(({ type, value }) => {
if (type === "day") {
return `<strong>${value}</strong>`;
}
return value;
}).join("");
console.log(html);Якщо значення походять із надійного Intl-форматувальника, їх зазвичай можна вставити в підготовлену структуру. Проте довільні дані користувача завжди потрібно екранувати перед вставленням у HTML.
У сучасних середовищах Intl.DateTimeFormat має метод formatRange(). Він форматує дві дати як один діапазон і не дублює спільні частини без потреби.
const formatter = new Intl.DateTimeFormat("uk-UA", {
dateStyle: "long",
timeZone: "UTC"
});
const start = new Date("2026-07-26T00:00:00Z");
const end = new Date("2026-07-30T00:00:00Z");
console.log(formatter.formatRange(start, end));Для отримання окремих частин діапазону існує formatRangeToParts():
const parts = formatter.formatRangeToParts(start, end);
console.log(parts);У результаті частини можуть мати поле source зі значенням на кшталт:
"startRange";
"endRange";
"shared".
Це дає змогу окремо стилізувати початок, кінець і спільні частини діапазону.
Створення Intl.DateTimeFormat може бути дорожчим, ніж виклик уже створеного форматувальника. Якщо формат потрібно застосовувати багато разів, створіть його один раз.
const formatter = new Intl.DateTimeFormat("uk-UA", {
dateStyle: "medium",
timeStyle: "short",
timeZone: "Europe/Kyiv"
});
const dates = [
new Date("2026-07-26T10:00:00Z"),
new Date("2026-07-27T12:30:00Z"),
new Date("2026-07-28T18:45:00Z")
];
for (const date of dates) {
console.log(formatter.format(date));
}Не створюйте новий форматувальник у великому циклі без потреби:
// Менш ефективно для великої кількості дат.
for (const date of dates) {
const text = new Intl.DateTimeFormat("uk-UA", {
dateStyle: "medium",
timeZone: "UTC"
}).format(date);
console.log(text);
}Метод resolvedOptions() повертає фактичні параметри форматувальника:
const formatter = new Intl.DateTimeFormat("uk-UA", {
dateStyle: "long",
timeStyle: "short",
timeZone: "Europe/Kyiv"
});
console.log(formatter.resolvedOptions());Це корисно, коли потрібно перевірити:
яку локаль було вибрано;
яку часову зону використано;
який календар активний;
яку систему числення застосовано;
який цикл годин обрано.
Для передбачуваної поведінки використовуйте ISO-подібні рядки з часовою зоною:
const utcDate = new Date("2026-07-26T15:30:00Z");
const offsetDate = new Date("2026-07-26T15:30:00+03:00");Дата "2026-07-26T15:30:00Z" означає момент у UTC.
Дата "2026-07-26T15:30:00+03:00" означає момент із явним зміщенням +03:00. Після створення об’єкта Date це вже абсолютний момент часу, який можна показувати в будь-якій часовій зоні.
Для даних із сервера бажано передавати повний час із часовою зоною:
const serverValue = "2026-07-26T15:30:00Z";
const date = new Date(serverValue);
const formatter = new Intl.DateTimeFormat("uk-UA", {
dateStyle: "long",
timeStyle: "short",
timeZone: "Europe/Kyiv"
});
console.log(formatter.format(date));Окремі рядки на кшталт "07/26/2026" залежать від формату й локалі та можуть неоднаково інтерпретуватися в різних середовищах.
Перед форматуванням потрібно розуміти, що саме представляє значення:
момент часу — конкретна точка на часовій шкалі, зазвичай ISO-рядок із Z або зміщенням;
календарна дата — наприклад день народження або дата платежу без часу;
локальний час — час події в певній часовій зоні.
Date добре підходить для моментів часу. Проте значення без часової зони може бути неоднозначним.
Наприклад, зустріч о 09:00 у Києві та зустріч о 09:00 у Токіо — це різні моменти часу. Для таких даних потрібно зберігати часову зону або зміщення окремо, а не лише локальний рядок.
// Небажаний підхід.
const date = new Date();
const text = `${date.getDate()}.${date.getMonth() + 1}.${date.getFullYear()}`;
console.log(text);Такий код:
не локалізує назви місяців;
не враховує формат конкретного регіону;
потребує ручного додавання нуля;
легко створює помилки під час роботи з часовими зонами.
Краще:
const text = new Intl.DateTimeFormat("uk-UA", {
dateStyle: "short"
}).format(new Date());
console.log(text);const date = new Date("2026-07-26T15:30:00Z");
console.log(new Intl.DateTimeFormat("uk-UA", {
timeStyle: "short",
timeZone: "UTC"
}).format(date));
console.log(new Intl.DateTimeFormat("uk-UA", {
timeStyle: "short",
timeZone: "Europe/Kyiv"
}).format(date));Це один момент часу, але його відображення різниться залежно від часової зони.
toLocaleDateString() для складного форматуванняМетоди toLocaleDateString() і toLocaleTimeString() зручні для простих випадків, але Intl.DateTimeFormat зручніший, коли форматувальник потрібно повторно використовувати або налаштовувати складні параметри.
const formatter = new Intl.DateTimeFormat("uk-UA", {
year: "numeric",
month: "long",
day: "numeric",
timeZone: "UTC"
});
console.log(formatter.format(date));Не варто перевіряти локалізований результат як рядок із жорстко заданою структурою:
// Така перевірка крихка.
if (formatter.format(date) === "26 липня 2026 р.") {
// ...
}На результат можуть впливати:
версія браузера;
операційна система;
база локалізації;
особливості конкретної локалі.
Для логіки застосунку зберігайте дату як значення або ISO-рядок, а форматований текст використовуйте лише для відображення.
Не використовуйте довільні скорочення:
// Ненадійно: скорочення можуть бути неоднозначними.
timeZone: "CST"Використовуйте ідентифікатори IANA:
timeZone: "America/Chicago"const date = new Date("not a date");
console.log(date.toString());
const formatter = new Intl.DateTimeFormat("uk-UA");
// Для невалідної дати форматування завершиться помилкою.
console.log(formatter.format(date));Перед форматуванням даних із зовнішніх джерел варто перевірити:
if (Number.isNaN(date.getTime())) {
throw new Error("Отримано невалідну дату");
}Нижче наведено функцію, яка форматує дату події для різних локалей і часових зон:
function formatEventDate(value, locale, timeZone) {
const date = new Date(value);
if (Number.isNaN(date.getTime())) {
throw new Error("Невалідне значення дати");
}
const formatter = new Intl.DateTimeFormat(locale, {
weekday: "long",
year: "numeric",
month: "long",
day: "numeric",
hour: "2-digit",
minute: "2-digit",
timeZone,
timeZoneName: "short"
});
return formatter.format(date);
}
const eventDate = "2026-07-26T15:30:00Z";
console.log(
formatEventDate(eventDate, "uk-UA", "Europe/Kyiv")
);
console.log(
formatEventDate(eventDate, "en-US", "America/New_York")
);Функція:
перетворює вхідний рядок на Date;
перевіряє коректність дати;
створює локалізований форматувальник;
враховує часову зону;
повертає готовий рядок для інтерфейсу.
Для поширених сценаріїв можна використовувати такі конфігурації:
// Коротка дата.
{
dateStyle: "short"
}
// Читабельна дата.
{
dateStyle: "long"
}
// Дата з повною назвою дня тижня.
{
dateStyle: "full"
}
// Час із секундами.
{
timeStyle: "medium"
}
// Дата та час.
{
dateStyle: "medium",
timeStyle: "short"
}
// Власна комбінація компонентів.
{
day: "2-digit",
month: "2-digit",
year: "numeric",
hour: "2-digit",
minute: "2-digit"
}Intl.DateTimeFormat локалізує форматування дат і часу.
Локаль передається першим аргументом конструктора.
Компоненти дати налаштовуються через year, month, day і weekday.
Компоненти часу налаштовуються через hour, minute, second та інші опції.
dateStyle і timeStyle спрощують вибір готового стилю.
timeZone дає змогу показати один момент часу в конкретній часовій зоні.
calendar і numberingSystem змінюють календар та систему числення.
formatToParts() повертає окремі частини локалізованого результату.
formatRange() форматує діапазон дат.
Для повторного форматування краще створити один екземпляр форматувальника.
Дати з сервера бажано передавати з явною часовою зоною або зміщенням.
Форматований текст призначений для відображення, а не для зберігання чи бізнес-логіки.