Avatar ·

Форматирование даты в JavaScript: где найти документацию и как это сделать правильно?

Всем привет! Я новичок в JavaScript и никак не могу разобраться с форматированием дат. Мне нужно вывести текущую дату в формате "ДД.ММ.ГГГГ", но я не могу найти внятной документации по этой теме. Вот что я пробовал: ```javascript let date = new Date(); console.log(date); // Выводит что-то вроде "Fri Dec 20 2024 14:30:00 GMT+0300" ``` Но мне нужно получить именно "20.12.2024". Я знаю, что в других языках (например, Java) есть `SimpleDateFormat` или `DateTimeFormatter`, где можно задать шаблон. В JavaScript я нашел только `toLocaleDateString()`, но он выводит дату в формате, зависящем от локали браузера, и я не могу контролировать порядок дня, месяца и года. Где вообще можно найти документацию по работе с датами? Я смотрел на MDN, но там описаны только базовые методы типа `getDate()`, `getMonth()`, `getFullYear()`. Неужели в JavaScript нет встроенного способа форматировать дату как строку с произвольным шаблоном? Или я что-то упускаю? Буду благодарен за ссылки на документацию и примеры кода. <<>>

Проблема форматирования дат в JavaScript

Вы абсолютно правы: в отличие от Java или Python, в JavaScript долгое время не было встроенного аналога SimpleDateFormat. Стандартный объект Date предоставляет только низкоуровневые методы-геттеры. Однако с выходом ECMAScript Internationalization API (Intl) и современных браузеров ситуация изменилась. Давайте разберем все способы.

1. Ручное форматирование (базовый способ)

Самый простой и наглядный способ — использовать методы-геттеры и собрать строку вручную. Это хорошая практика для понимания работы с датами:

function formatDate(date) {
    const day = String(date.getDate()).padStart(2, '0');
    const month = String(date.getMonth() + 1).padStart(2, '0'); // Месяцы от 0 до 11
    const year = date.getFullYear();
    return `${day}.${month}.${year}`;
}

console.log(formatDate(new Date())); // "20.12.2024"

Важно: getMonth() возвращает значение от 0 (январь) до 11 (декабрь), поэтому всегда добавляем +1. Метод padStart(2, '0') гарантирует, что день и месяц будут двузначными.

2. Использование Intl.DateTimeFormat (рекомендуемый способ)

Современный и гибкий метод — Intl.DateTimeFormat. Он позволяет задать формат через конфигурационный объект без ручной сборки:

const date = new Date();
const formatter = new Intl.DateTimeFormat('ru-RU', {
    day: '2-digit',
    month: '2-digit',
    year: 'numeric'
});
console.log(formatter.format(date)); // "20.12.2024"

Вы можете комбинировать опции: hour, minute, second, weekday (день недели) и другие. Вот пример с временем:

const formatterWithTime = new Intl.DateTimeFormat('ru-RU', {
    year: 'numeric',
    month: 'long', // "декабрь"
    day: 'numeric',
    hour: '2-digit',
    minute: '2-digit'
});
console.log(formatterWithTime.format(new Date())); // "20 декабря 2024 г., 14:30"

Этот метод поддерживается во всех современных браузерах и Node.js (начиная с версии 13).

3. Библиотеки для сложных случаев

Если вам нужно часто форматировать даты или работать с часовыми поясами, используйте библиотеки:

  • date-fns — легковесная (2KB gzipped), модульная, с функциями format():
  • import { format } from 'date-fns';
    const date = new Date();
    console.log(format(date, 'dd.MM.yyyy')); // "20.12.2024"
  • Luxon — современная обертка над Intl, с поддержкой часовых поясов:
  • import { DateTime } from 'luxon';
    const dt = DateTime.now();
    console.log(dt.toFormat('dd.MM.yyyy')); // "20.12.2024"
  • Day.js — минималистичная (2KB), API как у Moment.js, но легче:
  • const dayjs = require('dayjs');
    console.log(dayjs().format('DD.MM.YYYY')); // "20.12.2024"

Где искать документацию?

  • MDN Web Docs — раздел Date (все методы-геттеры) и Intl.DateTimeFormat.
  • ECMAScript Specification — официальный стандарт, но сложен для чтения.
  • GitHub репозитории библиотек — документация date-fns, Luxon и Day.js отличная.

Резюме: Для простых форматов используйте ручной метод или Intl.DateTimeFormat. Для сложных проектов (часовые пояса, локализация, парсинг) — библиотеки. Избегайте устаревшей Moment.js — сейчас рекомендуется date-fns или Luxon.

<<>>

Альтернативный подход: toLocaleDateString с массивом опций

Вы упомянули toLocaleDateString(), и это действительно хороший старт. Проблема в том, что по умолчанию он использует локаль браузера. Но вы можете передать вторым аргументом объект с опциями, чтобы контролировать формат:

const date = new Date();
const options = { 
    day: '2-digit', 
    month: '2-digit', 
    year: 'numeric' 
};
console.log(date.toLocaleDateString('ru-RU', options)); // "20.12.2024"
// Для английского формата (MM/DD/YYYY):
console.log(date.toLocaleDateString('en-US', options)); // "12/20/2024"

Этот метод — сокращенная версия Intl.DateTimeFormat, но с тем же функционалом. Он поддерживается во всех браузерах, включая старые (IE11 с оговорками).

Почему это не идеально для всех случаев?

Метод toLocaleDateString не умеет выводить день недели или название месяца прописью в одном вызове — для этого нужен Intl.DateTimeFormat. Также он не поддерживает кастомные разделители (например, точки вместо слешей) — для этого придется использовать ручную сборку или библиотеку.

Бонус: форматирование с помощью toISOString

Если вам нужен формат ISO 8601 (например, для API), используйте встроенный метод:

console.log(new Date().toISOString()); // "2024-12-20T11:30:00.000Z"

Этот формат широко используется в JSON и базах данных. Для преобразования в локальное время придется дополнительно обрабатывать строку.