Кратко
СкопированоIntl — объект, содержащий функции форматирования даты и времени с учётом локали.
Конструктор объекта Intl принимает следующие параметры:
localesкод или массив идентификаторов локалей. Элементы этого массива могут обозначать язык, напримерen, или язык и регион, напримерenи также дополнительные обозначения, например- U S zh– китайский язык, упрощённый китайский скрипт и регион Китай.- Hans - C N optionsдополнительные опции.
Как понять
СкопированоФорматирование объекта Date — настоящая головная боль. Чтобы красиво отображать дату и время не обязательно подключать тяжеловесные сторонние библиотеки. Можно воспользоваться встроенным объектом Intl.
Этот способ форматирования поддерживается всеми современными браузерами.
Пример
СкопированоЧтобы отобразить дату несколькими, способами создадим объект даты при помощи статического метода . Этот метод возвращает количество миллисекунд с момента начала unix-эпохи. работает с всемирным координатным временем (UTC)
const date = new Date(Date.UTC(2020, 11, 20, 3, 23, 16, 738));
const date = new Date(Date.UTC(2020, 11, 20, 3, 23, 16, 738));
Стандартное форматирование, в зависимости от локали:
console.log(new Intl.DateTimeFormat('en-US').format(date));// "12/20/2020"
console.log(new Intl.DateTimeFormat('en-US').format(date));
// "12/20/2020"
console.log(new Intl.DateTimeFormat("ru", { weekday: "short", year: "2-digit", month: "long", day: "numeric"}).format(date))// вс, 20 декабря 20 г.
console.log(new Intl.DateTimeFormat("ru", {
weekday: "short",
year: "2-digit",
month: "long",
day: "numeric"}).format(date))
// вс, 20 декабря 20 г.
Укажем формат даты и времени, используя параметр style (full, long, medium, short):
console.log(new Intl.DateTimeFormat('en-GB', { dateStyle: 'full', timeStyle: 'long', timeZone: 'Australia/Sydney' }).format(date));// "Sunday, 20 December 2020 at 14:23:16 GMT+11"
console.log(new Intl.DateTimeFormat('en-GB', { dateStyle: 'full', timeStyle: 'long', timeZone: 'Australia/Sydney' }).format(date));
// "Sunday, 20 December 2020 at 14:23:16 GMT+11"
Как пишется
Скопировано
// создание экземпляраconst formattedDate = new Intl.DateTimeFormat('ru').format(date);
// создание экземпляра
const formattedDate = new Intl.DateTimeFormat('ru').format(date);
Опции
Скопированоtime— значение часового пояса:Zone UTC,America,/ New _ York Europeи т.д./ Paris calendar— значение выбранного календаря:chinese,gregory,indianи т.д.numbering— используемая система счисления:System arab,beng,latinи т.д.locale— алгоритм для согласования выбранной локали:Matcher lookup— поиск следует алгоритму поиска, определённому в BCP 47,best fit— (наилучший подходящий) позволяет среде выполнения выбрать локаль.
formatалгоритм для форматирования: basic, best fit.Matcher hour12если имеет значение true, используется 12-часовой формат.hourчасовой формат: h11, h12, h23, h24.Cycle dateстиль форматирования даты: full, long, medium, short.Style weekdayдень недели: long, short, narrow.dayдень месяца: numeric, 2-digit.monthмесяц: numeric, 2-digit, long, short, narrow.yearгод: numeric, 2-digit.eraэпоха: long, short, narrow.timeстиль форматирования времени: full, long, medium, short.Style hourчасы: numeric, 2-digit.minuteминуты: numeric, 2-digit.secondсекунды: numeric, 2-digit.dayчасть дня (утро, вечер и т.п.): narrow, short, long.Period timeназвание часового пояса (UTC, PTC): long, short.Zone Name
Методы
СкопированоIntl — геттер, который форматирует дату, в соответствии с языковым стандартом и параметрами форматирования этого объекта DateTimeFormat. Возвращает текущую дату в кратком виде (date) в виде строки.
const date = Date.now();const formatter = new Intl.DateTimeFormat('ru', { weekday: 'long', year: 'numeric', month: 'numeric', day: 'numeric', hour: 'numeric', minute: 'numeric', second: 'numeric', hour12: true, timeZone: 'UTC'});formatter.format(date);// суббота, 27.05.2023 г., 10:55:18 PM
const date = Date.now();
const formatter = new Intl.DateTimeFormat('ru', {
weekday: 'long',
year: 'numeric',
month: 'numeric',
day: 'numeric',
hour: 'numeric',
minute: 'numeric',
second: 'numeric',
hour12: true,
timeZone: 'UTC'
});
formatter.format(date);
// суббота, 27.05.2023 г., 10:55:18 PM
Intl — форматирует передаваемую строку по частям с учётом DateTime. Возвращает массив объектов, представляющих строку даты в частях, которые можно использовать для настраиваемого форматирования с учётом локали.
formatter.formatToParts(date);
formatter.formatToParts(date);
В консоли мы получим следующее:
[ {type: 'weekday', value: 'суббота'}, {type: 'literal', value: ', '}, {type: 'day', value: '27'}, {type: 'literal', value: '.'}, {type: 'month', value: '05'}, {type: 'literal', value: '.'}, {type: 'year', value: '2023'}, {type: 'literal', value: ' г., '}, {type: 'hour', value: '10'}, {type: 'literal', value: ':'}, {type: 'minute', value: '55'}, {type: 'literal', value: ':'}, {type: 'second', value: '18'}, {type: 'literal', value: ' '}, {type: 'dayPeriod', value: 'PM'}]
[
{type: 'weekday', value: 'суббота'},
{type: 'literal', value: ', '},
{type: 'day', value: '27'},
{type: 'literal', value: '.'},
{type: 'month', value: '05'},
{type: 'literal', value: '.'},
{type: 'year', value: '2023'},
{type: 'literal', value: ' г., '},
{type: 'hour', value: '10'},
{type: 'literal', value: ':'},
{type: 'minute', value: '55'},
{type: 'literal', value: ':'},
{type: 'second', value: '18'},
{type: 'literal', value: ' '},
{type: 'dayPeriod', value: 'PM'}
]
Intl — возвращает новый объект со свойствами, отражающими локаль и параметры форматирования, которые вычислены при инициализации объекта.
{ calendar: "gregory", day: "2-digit", hour: "numeric", hour12: true, hourCycle: "h11", locale: "ru", minute: "2-digit", month: "2-digit", numberingSystem: "latn", second: "2-digit", timeZone: "UTC", weekday: "long", year: "numeric"}
{
calendar: "gregory",
day: "2-digit",
hour: "numeric",
hour12: true,
hourCycle: "h11",
locale: "ru",
minute: "2-digit",
month: "2-digit",
numberingSystem: "latn",
second: "2-digit",
timeZone: "UTC",
weekday: "long",
year: "numeric"
}
Intl —
получает две даты и форматирует диапазон дат наиболее кратким образом на основе языкового стандарта и параметров, предоставленных при создании экземпляра DateTime.
const date1 = new Date(Date.UTC(2018, 0, 10, 10, 0, 0));const currentDate = Date.now();const fmt1 = new Intl.DateTimeFormat("en", { year: "2-digit", month: "numeric", day: "numeric", hour: "numeric", minute: "numeric",});console.log(fmt1.formatRange(date1, currentDate));// 1/10/18, 1:00 PM – 5/28/23, 2:08 AM
const date1 = new Date(Date.UTC(2018, 0, 10, 10, 0, 0));
const currentDate = Date.now();
const fmt1 = new Intl.DateTimeFormat("en", {
year: "2-digit",
month: "numeric",
day: "numeric",
hour: "numeric",
minute: "numeric",
});
console.log(fmt1.formatRange(date1, currentDate));
// 1/10/18, 1:00 PM – 5/28/23, 2:08 AM
Intl —
получает две даты и возвращает массив объектов, содержащих токены, зависящие от языкового стандарта, представляющие каждую часть отформатированного диапазона дат. Возвращает формат, аналогичный format.
const date1 = new Date(Date.UTC(2018, 0, 10, 10, 0, 0));const currentDate = Date.now();const dateTimeFormat = new Intl.DateTimeFormat('en', { hour: 'numeric', minute: 'numeric'});const parts = dateTimeFormat.formatRangeToParts(date1, currentDate);for (const part of parts) { console.log(part);}
const date1 = new Date(Date.UTC(2018, 0, 10, 10, 0, 0));
const currentDate = Date.now();
const dateTimeFormat = new Intl.DateTimeFormat('en', {
hour: 'numeric',
minute: 'numeric'
});
const parts = dateTimeFormat.formatRangeToParts(date1, currentDate);
for (const part of parts) {
console.log(part);
}
В консоли мы получим следующее:
[ {type: 'month', value: '1', source: 'startRange'}, {type: 'literal', value: '/', source: 'startRange'}, {type: 'day', value: '10', source: 'startRange'}, {type: 'literal', value: '/', source: 'startRange'}, {type: 'year', value: '2018', source: 'startRange'}, {type: 'literal', value: ', ', source: 'startRange'}, {type: 'hour', value: '1', source: 'startRange'}, {type: 'literal', value: ':', source: 'startRange'}, {type: 'minute', value: '00', source: 'startRange'}, {type: 'literal', value: ' ', source: 'startRange'}, {type: 'dayPeriod', value: 'PM', source: 'startRange'}, {type: 'literal', value: ' – ', source: 'shared'}, {type: 'month', value: '5', source: 'endRange'}, {type: 'literal', value: '/', source: 'endRange'}, {type: 'day', value: '29', source: 'endRange'}, {type: 'literal', value: '/', source: 'endRange'}, {type: 'year', value: '2023', source: 'endRange'}, {type: 'literal', value: ', ', source: 'endRange'}, {type: 'hour', value: '12', source: 'endRange'}, {type: 'literal', value: ':', source: 'endRange'}, {type: 'minute', value: '41', source: 'endRange'}, {type: 'literal', value: ' ', source: 'endRange'}, {type: 'dayPeriod', value: 'PM', source: 'endRange'}]
[
{type: 'month', value: '1', source: 'startRange'},
{type: 'literal', value: '/', source: 'startRange'},
{type: 'day', value: '10', source: 'startRange'},
{type: 'literal', value: '/', source: 'startRange'},
{type: 'year', value: '2018', source: 'startRange'},
{type: 'literal', value: ', ', source: 'startRange'},
{type: 'hour', value: '1', source: 'startRange'},
{type: 'literal', value: ':', source: 'startRange'},
{type: 'minute', value: '00', source: 'startRange'},
{type: 'literal', value: ' ', source: 'startRange'},
{type: 'dayPeriod', value: 'PM', source: 'startRange'},
{type: 'literal', value: ' – ', source: 'shared'},
{type: 'month', value: '5', source: 'endRange'},
{type: 'literal', value: '/', source: 'endRange'},
{type: 'day', value: '29', source: 'endRange'},
{type: 'literal', value: '/', source: 'endRange'},
{type: 'year', value: '2023', source: 'endRange'},
{type: 'literal', value: ', ', source: 'endRange'},
{type: 'hour', value: '12', source: 'endRange'},
{type: 'literal', value: ':', source: 'endRange'},
{type: 'minute', value: '41', source: 'endRange'},
{type: 'literal', value: ' ', source: 'endRange'},
{type: 'dayPeriod', value: 'PM', source: 'endRange'}
]
Преобразование в ISO формат
СкопированоУ объекта Date есть метод to, который возвращает строку в расширенном ISO формате - YYYY. Часовой пояс всегда равен UTC, что обозначено суффиксом "Z".
Но Intl не позволяет выбрать в качестве формата iso8601. Код, приведённый ниже, упадёт с ошибкой:
const date = new Date();const options = { year: 'numeric', month: 'numeric', day: 'numeric'};const isoDate = new Intl.DateTimeFormat(['iso8601'], options).format(date);// Uncaught RangeError: Incorrect locale information provided at new DateTimeFormat...
const date = new Date();
const options = {
year: 'numeric',
month: 'numeric',
day: 'numeric'
};
const isoDate = new Intl.DateTimeFormat(['iso8601'], options).format(date);
// Uncaught RangeError: Incorrect locale information provided at new DateTimeFormat...
Почему возникает такая ошибка?
Дело в том, что Intl работает только с локалью. Так как в формате ISO-8601 нет никакой локали, то и отформатировать его не получится.
Однако можно вручную преобразовать дату в формат, совместимый с ISO-8601:
const date = new Date();const dateOptions = { year: 'numeric', month: 'numeric', day: 'numeric',};const formattedDate = new Intl.DateTimeFormat('en-ca', dateOptions).format(date);const timeOptions = { hour: 'numeric', minute: 'numeric', second: 'numeric', hourCycle: 'h24',}const formattedTime = new Intl.DateTimeFormat('en-ca', timeOptions).format(date);const dateTime = `${formattedDate}T${formattedTime}Z`;// '2023-05-29T15:00:00Z'
const date = new Date();
const dateOptions = {
year: 'numeric',
month: 'numeric',
day: 'numeric',
};
const formattedDate = new Intl.DateTimeFormat('en-ca', dateOptions).format(date);
const timeOptions = {
hour: 'numeric',
minute: 'numeric',
second: 'numeric',
hourCycle: 'h24',
}
const formattedTime = new Intl.DateTimeFormat('en-ca', timeOptions).format(date);
const dateTime = `${formattedDate}T${formattedTime}Z`;
// '2023-05-29T15:00:00Z'