Avatar ·

Как получить текущую дату в JavaScript? (форматирование даты)

Всем привет! Я только начал изучать JavaScript и столкнулся с простой, на первый взгляд, задачей: мне нужно вывести текущую дату на веб-странице в формате "дд.мм.гггг". Я знаю, что есть объект `Date`, но когда я пишу `new Date()`, в консоли выводится что-то вроде "Mon Oct 14 2024 15:30:00 GMT+0300". Это совсем не то, что мне нужно. Я пробовал использовать методы `getDate()`, `getMonth()`, `getFullYear()`, но получаю числа, и мне приходится вручную добавлять нули перед днями и месяцами, если они меньше 10. Кроме того, я не понимаю, почему `getMonth()` возвращает 9 для октября, а не 10. Подскажите, как правильно и красиво получить текущую дату в нужном формате? Может быть, есть какой-то готовый метод или библиотека? Или нужно каждый раз писать свою функцию форматирования? Вот пример моего кода, который пока не работает как надо: ```javascript let now = new Date(); let day = now.getDate(); let month = now.getMonth() + 1; // Почему нужно добавлять 1? let year = now.getFullYear(); console.log(day + '.' + month + '.' + year); // Выводит "14.10.2024", но без ведущих нулей ``` Как сделать, чтобы дни и месяцы всегда были двузначными (например, "01" вместо "1")? И есть ли способ получить сразу отформатированную строку без всех этих ручных манипуляций? <<>>

Получение и форматирование текущей даты в 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' — 2024
  • year: '2-digit' — 24
  • month: '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() — он самый простой и учитывает локаль пользователя.