Форматирование даты в 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"
import { DateTime } from 'luxon';
const dt = DateTime.now();
console.log(dt.toFormat('dd.MM.yyyy')); // "20.12.2024"
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 и базах данных. Для преобразования в локальное время придется дополнительно обрабатывать строку.