Как получить текущую дату в JavaScript? (форматирование даты)
Получение и форматирование текущей даты в JavaScript
Отличный вопрос! Действительно, работа с датами в JavaScript может показаться неинтуитивной новичкам. Давайте разберем всё по порядку.
Почему getMonth() возвращает 0-11?
В JavaScript месяцы нумеруются с 0 (январь) по 11 (декабрь). Это историческое наследие, и к этому нужно просто привыкнуть. Поэтому для получения реального номера месяца всегда нужно прибавлять 1: now.getMonth() + 1.
Основной способ: ручное форматирование с ведущими нулями
Самый надёжный и понятный способ — написать небольшую функцию-помощник. Для добавления ведущего нуля мы используем метод padStart() у строк:
function getFormattedDate() {
const now = new Date();
const day = String(now.getDate()).padStart(2, '0');
const month = String(now.getMonth() + 1).padStart(2, '0');
const year = now.getFullYear();
return `${day}.${month}.${year}`;
}
console.log(getFormattedDate()); // "14.10.2024"
Метод padStart(2, '0') гарантирует, что строка будет минимум 2 символа, и если она короче, то спереди добавляются нули.
Современный способ: toLocaleDateString()
Если вы не хотите писать свою функцию, JavaScript предоставляет встроенный метод для локализованного форматирования дат. Он использует системные настройки или указанную локаль:
const now = new Date();
const options = {
day: '2-digit',
month: '2-digit',
year: 'numeric'
};
// Русская локаль
console.log(now.toLocaleDateString('ru-RU', options)); // "14.10.2024"
// Американский формат
console.log(now.toLocaleDateString('en-US', options)); // "10/14/2024"
Этот метод гораздо гибче: он сам заботится о ведущих нулях и учитывает региональные стандарты. Вы можете менять опции:
year: 'numeric'— 2024year: '2-digit'— 24month: 'long'— "октябрь"weekday: 'long'— "понедельник"
Продвинутый способ: Intl.DateTimeFormat
Для более сложных сценариев (например, когда нужно много раз форматировать даты в одном формате) лучше использовать объект Intl.DateTimeFormat:
const formatter = new Intl.DateTimeFormat('ru-RU', {
day: '2-digit',
month: '2-digit',
year: 'numeric'
});
console.log(formatter.format(new Date())); // "14.10.2024"
console.log(formatter.format(new Date(2023, 0, 5))); // "05.01.2023"
Когда использовать библиотеки?
Для большинства задач встроенных методов достаточно. Но если вы работаете с часовыми поясами, сложными манипуляциями (прибавление месяцев, сравнение дат) или нужен очень специфичный формат, рассмотрите библиотеки:
- date-fns — легковесная, модульная
- Day.js — минималистичная альтернатива Moment.js
- Luxon — современная, от создателей Moment.js
Пример с Day.js:
// npm install dayjs
const dayjs = require('dayjs');
console.log(dayjs().format('DD.MM.YYYY')); // "14.10.2024"
Итог: Для простого форматирования используйте toLocaleDateString() или свою функцию с padStart(). Для сложных проектов — библиотеки. Главное — помните про нумерацию месяцев с 0!
Альтернативный подход: метод toISOString() и работа с UTC
Если вам не нужна локальная дата, а требуется получить дату в формате UTC (например, для отправки на сервер), можно использовать метод toISOString(). Он возвращает строку в формате ISO 8601: 2024-10-14T12:30:00.000Z.
Из этой строки легко вырезать нужные части:
const now = new Date();
const isoString = now.toISOString(); // "2024-10-14T12:30:00.000Z"
const datePart = isoString.split('T')[0]; // "2024-10-14"
const [year, month, day] = datePart.split('-');
// Формат "дд.мм.гггг"
console.log(`${day}.${month}.${year}`); // "14.10.2024"
Важное предостережение: toISOString() всегда возвращает время в UTC (GMT+0). Если ваш пользователь находится в часовом поясе +3, то вы получите дату, которая может отличаться от локальной. Например, если локально 15 октября 00:30, то в UTC будет ещё 14 октября. Используйте этот метод только когда вам действительно нужно время по Гринвичу.
Ещё один простой трюк — использование JSON.stringify(). При сериализации объекта Date он автоматически вызывает toISOString():
const now = new Date();
const jsonDate = JSON.stringify(now); // '"2024-10-14T12:30:00.000Z"'
// Можно распарсить и взять только дату
const cleanDate = JSON.parse(jsonDate).slice(0, 10); // "2024-10-14"
Но для повседневной работы я рекомендую первый ответ с toLocaleDateString() — он самый простой и учитывает локаль пользователя.