Как отобразить только определённые части даты?
Используйте параметры Intl.DateTimeFormat, чтобы показывать отдельные компоненты даты, такие как год, месяц, день и день недели
Введение
Полные форматы даты, например «вторник, 15 октября 2024», подходят не всегда — часто нужно показать только отдельные части даты. Например, только месяц и год для даты публикации, только день недели для календаря или только день и месяц для дня рождения.
В JavaScript Intl.DateTimeFormat позволяет настраивать отображение каждого компонента даты отдельно. Вместо выбора готового стиля, такого как «полный» или «краткий», вы указываете, какие части включить и как их форматировать.
Компоненты даты
Дата состоит из четырёх основных компонентов, которые можно форматировать независимо друг от друга.
weekday показывает, какой это день недели. year — какой это год. month — какой это месяц. day — какой это день месяца.
Для каждого компонента доступны разные значения форматирования, которые определяют, как он будет отображаться. В объекте options вы указываете только нужные компоненты.
Форматирование дня недели
Параметр weekday отвечает за отображение дня недели. Он принимает три значения, которые определяют длину результата.
const date = new Date('2024-10-15');
const narrow = new Intl.DateTimeFormat('en-US', {
weekday: 'narrow'
});
console.log(narrow.format(date)); // "T"
const short = new Intl.DateTimeFormat('en-US', {
weekday: 'short'
});
console.log(short.format(date)); // "Tue"
const long = new Intl.DateTimeFormat('en-US', {
weekday: 'long'
});
console.log(long.format(date)); // "Tuesday"
Значение narrow выводит одну букву. short — сокращённое название. long — полное название дня недели.
В некоторых языках два дня недели могут иметь одинаковое сокращение в стиле narrow. Например, во вторник и четверг в английском оба начинаются с «T».
Форматирование года
Опция year отображает год. Она принимает два значения.
const date = new Date('2024-10-15');
const numeric = new Intl.DateTimeFormat('en-US', {
year: 'numeric'
});
console.log(numeric.format(date)); // "2024"
const twoDigit = new Intl.DateTimeFormat('en-US', {
year: '2-digit'
});
console.log(twoDigit.format(date)); // "24"
Значение numeric показывает полный год. Значение 2-digit отображает только последние две цифры.
Форматирование месяца
Опция month отображает месяц года. Она принимает пять значений, которые дают разную степень детализации.
const date = new Date('2024-10-15');
const numeric = new Intl.DateTimeFormat('en-US', {
month: 'numeric'
});
console.log(numeric.format(date)); // "10"
const twoDigit = new Intl.DateTimeFormat('en-US', {
month: '2-digit'
});
console.log(twoDigit.format(date)); // "10"
const narrow = new Intl.DateTimeFormat('en-US', {
month: 'narrow'
});
console.log(narrow.format(date)); // "O"
const short = new Intl.DateTimeFormat('en-US', {
month: 'short'
});
console.log(short.format(date)); // "Oct"
const long = new Intl.DateTimeFormat('en-US', {
month: 'long'
});
console.log(long.format(date)); // "October"
Значение numeric отображает месяц числом без ведущих нулей. Значение 2-digit отображает месяц числом с ведущими нулями. Значение narrow выводит одну букву. Значение short выводит сокращённое название месяца. Значение long выводит полное название месяца.
В некоторых языках два месяца могут иметь одинаковый узкий стиль. Например, в английском марте и мае оба начинаются с "M".
Форматирование дня
Опция day отображает день месяца. Она принимает два значения.
const date = new Date('2024-10-15');
const numeric = new Intl.DateTimeFormat('en-US', {
day: 'numeric'
});
console.log(numeric.format(date)); // "15"
const twoDigit = new Intl.DateTimeFormat('en-US', {
day: '2-digit'
});
console.log(twoDigit.format(date)); // "15"
Значение numeric отображает день без ведущих нулей. Значение 2-digit отображает день с ведущими нулями.
Для однозначных дней numeric выдаёт значения вроде "5", а 2-digit — "05".
Комбинирование нескольких частей даты
Можно указать несколько опций в одном форматтере, чтобы получить нужную комбинацию.
const date = new Date('2024-10-15');
// Month and year only
const monthYear = new Intl.DateTimeFormat('en-US', {
year: 'numeric',
month: 'long'
});
console.log(monthYear.format(date)); // "October 2024"
// Weekday and day only
const weekdayDay = new Intl.DateTimeFormat('en-US', {
weekday: 'short',
day: 'numeric'
});
console.log(weekdayDay.format(date)); // "Tue 15"
// Month and day only
const monthDay = new Intl.DateTimeFormat('en-US', {
month: 'long',
day: 'numeric'
});
console.log(monthDay.format(date)); // "October 15"
// All components with custom formatting
const custom = new Intl.DateTimeFormat('en-US', {
weekday: 'long',
year: 'numeric',
month: 'short',
day: '2-digit'
});
console.log(custom.format(date)); // "Tuesday, Oct 15, 2024"
Форматтер автоматически расставляет компоненты в соответствии с правилами локали. Не нужно думать о порядке или знаках препинания.
Как работают опции в разных локалях
Одни и те же опции дают разные результаты в разных локалях. Каждая локаль использует свои правила для порядка и формата отображения частей даты.
const date = new Date('2024-10-15');
const options = {
year: 'numeric',
month: 'long',
day: 'numeric'
};
const en = new Intl.DateTimeFormat('en-US', options);
console.log(en.format(date)); // "October 15, 2024"
const de = new Intl.DateTimeFormat('de-DE', options);
console.log(de.format(date)); // "15. Oktober 2024"
const ja = new Intl.DateTimeFormat('ja-JP', options);
console.log(ja.format(date)); // "2024年10月15日"
const ar = new Intl.DateTimeFormat('ar-SA', options);
console.log(ar.format(date)); // "١٥ أكتوبر ٢٠٢٤"
В немецком сначала указывается день и используется точка как разделитель. В японском — порядок год-месяц-день с японскими иероглифами. В арабском — арабский шрифт для названия месяца и чисел.
Названия дней недели и месяцев тоже меняются в зависимости от локали.
const date = new Date('2024-10-15');
const options = {
weekday: 'long',
month: 'long'
};
const en = new Intl.DateTimeFormat('en-US', options);
console.log(en.format(date)); // "Tuesday, October"
const fr = new Intl.DateTimeFormat('fr-FR', options);
console.log(fr.format(date)); // "mardi octobre"
const es = new Intl.DateTimeFormat('es-ES', options);
console.log(es.format(date)); // "martes, octubre"
Во французском названия дней недели и месяцев пишутся с маленькой буквы. В испанском тоже используется строчные буквы, но добавляется запятая как разделитель.
Типовые сценарии использования
Отображение месяца и года отлично подходит для дат публикации и архивов.
const date = new Date('2024-10-15');
const formatter = new Intl.DateTimeFormat('en-US', {
year: 'numeric',
month: 'long'
});
console.log(`Published: ${formatter.format(date)}`);
// "Published: October 2024"
Показ названий дней недели удобен для календарей и расписаний.
const date = new Date('2024-10-15');
const formatter = new Intl.DateTimeFormat('en-US', {
weekday: 'long'
});
console.log(`Event on ${formatter.format(date)}`);
// "Event on Tuesday"
Показ месяца и дня без года хорошо подходит для дней рождения и ежегодных событий.
const date = new Date('2024-10-15');
const formatter = new Intl.DateTimeFormat('en-US', {
month: 'long',
day: 'numeric'
});
console.log(`Birthday: ${formatter.format(date)}`);
// "Birthday: October 15"
Итоги
Объект опций Intl.DateTimeFormat позволяет выводить только нужные части даты вместо полной даты. Опция weekday принимает значения narrow, short или long. Опция year принимает numeric или 2-digit. Опция month принимает numeric, 2-digit, narrow, short или long. Опция day принимает numeric или 2-digit.
Можно комбинировать несколько опций, чтобы показывать только нужные части даты. Форматтер сам расставит порядок и знаки препинания в зависимости от локали. В разных локалях используются свои правила отображения одних и тех же компонентов даты.