Урок 15: Работа с датами в JavaScript’е

Это важная тема, ведь почти каждое приложение так или иначе взаимодействует с датами, от отображения текущего времени до расчета дедлайнов или анализа данных. В этом уроке я подробно расскажу об объекте Date, форматировании дат и вычислении временных промежутков. А чтобы закрепить знания, вас ждут практические задачи и примеры кода.

Объект Date

В JavaScript все операции с датами и временем выполняются через объект Date. Он позволяет создавать, изменять и форматировать даты. Давайте разберемся, как он работает.

Создание объекта Date

Объект Date можно создать несколькими способами:

1. Текущая дата и время

Если вызвать конструктор new Date() без аргументов, он вернет текущие дату и время:

const now = new Date();
console.log(now); // Пример вывода: 2025-10-15T14:20:30.000Z

2. Дата из строки

Можно передать строку в формате, который понимает JavaScript:

const dateStr = new Date('2025-10-15T14:20:30');
console.log(dateStr); // 2025-10-15T14:20:30.000Z

3. Дата из чисел

Конструктор принимает до 7 аргументов: год, месяц, день, часы, минуты, секунды, миллисекунды.
Месяцы нумеруются с 0 (январь) до 11 (декабрь)!

const dateNum = new Date(2025, 9, 15, 14, 20, 30); // 15 октября 2025, 14:20:30
console.log(dateNum); // 2025-10-15T11:20:30.000Z (UTC+0)

Методы объекта Date

Объект Date содержит множество методов для получения и установки компонентов даты. Вот ключевые из них:

Метод Описание Пример для 2025-10-15 14:20:30
getFullYear() Год (4 цифры) 2025
getMonth() Месяц (0-11) 9 (октябрь)
getDate() День месяца (1-31) 15
getHours() Часы (0-23) 14
getMinutes() Минуты (0-59) 20
getSeconds() Секунды (0-59) 30
getMilliseconds() Миллисекунды (0-999) 0
getDay() День недели (0-6, 0=воскресенье) 0 (15 октября 2025 — воскресенье)

Пример:

const date = new Date(2025, 9, 15);
console.log(date.getFullYear()); // 2025
console.log(date.getMonth());    // 9 (октябрь)
console.log(date.getDate());     // 15

UTC или локальное время

JavaScript работает с датами в двух режимах: локальном (зависит от часового пояса пользователя) и UTC (всемирное координированное время). Для получения UTC-значений используйте методы с префиксом getUTC:

const date = new Date();
console.log(date.getHours());      // Локальные часы
console.log(date.getUTCHours());   // Часы по UTC

Форматирование дат

К сожалению, в JavaScript нет встроенной функции для красивого форматирования дат, но мы можем собрать строку вручную или использовать библиотеки.

Ручное форматирование

Соберем дату в формате дд.мм.гггг:

function formatDate(date) {
  const day = String(date.getDate()).padStart(2, '0');
  const month = String(date.getMonth() + 1).padStart(2, '0');
  const year = date.getFullYear();
  return `${day}.${month}.${year}`;
}

const today = new Date();
console.log(formatDate(today)); // 15.10.2025

Использование toLocaleDateString()

Этот метод возвращает локализованную строку даты:

const date = new Date();
console.log(date.toLocaleDateString('ru-RU')); // 15.10.2025
console.log(date.toLocaleDateString('en-US')); // 10/15/2025

Параметры:

date.toLocaleDateString('ru-RU', {
  weekday: 'long', // "воскресенье"
  year: 'numeric',
  month: 'long',   // "октябрь"
  day: 'numeric'
}); // "15 октября 2025 г."

Вычисление временных промежутков

Часто нужно рассчитать разницу между датами. В JavaScript это делается через разницу в миллисекундах.

Разница между датами

const start = new Date(2025, 9, 1); // 1 октября 2025
const end = new Date(2025, 9, 15);  // 15 октября 2025
const diffMs = end - start;         // Разница в миллисекундах
const diffDays = diffMs / (1000 * 60 * 60 * 24);
console.log(diffDays); // 14 дней

Добавление и вычитание времени

Используйте методы setXXX(), например:

const date = new Date();
date.setDate(date.getDate() + 7); // Добавить 7 дней
console.log(date); // Через неделю

Пример функции для добавления дней:

function addDays(date, days) {
  const result = new Date(date);
  result.setDate(result.getDate() + days);
  return result;
}

const now = new Date();
console.log(addDays(now, 10)); // Дата + 10 дней

Практические задачи

Закрепим знания на практике! Решите задачи и сверьтесь с решениями.

Задача 1: Текущая дата в формате «гггг-мм-дд»

Напишите функцию, которая возвращает текущую дату в формате гггг-мм-дд.

Решение:

function getCurrentDate() {
  const date = new Date();
  const year = date.getFullYear();
  const month = String(date.getMonth() + 1).padStart(2, '0');
  const day = String(date.getDate()).padStart(2, '0');
  return `${year}-${month}-${day}`;
}

console.log(getCurrentDate()); // 2025-10-15

Задача 2: Калькулятор возраста

Напишите функцию, которая принимает дату рождения и возвращает возраст человека.

Решение:

function calculateAge(birthDate) {
  const today = new Date();
  const birthYear = birthDate.getFullYear();
  const currentYear = today.getFullYear();
  let age = currentYear - birthYear;

  // Проверяем, был ли уже день рождения в этом году
  const birthMonth = birthDate.getMonth();
  const currentMonth = today.getMonth();
  if (
    currentMonth < birthMonth ||
    (currentMonth === birthMonth && today.getDate() < birthDate.getDate())
  ) {
    age--;
  }
  return age;
}

const birthDate = new Date(1990, 5, 15);
console.log(calculateAge(birthDate)); // Например, 33

Задача 3: Таймер до Нового года

Напишите код, который выводит, сколько дней, часов и минут осталось до Нового года.

Решение:

function timeUntilNewYear() {
  const now = new Date();
  const newYear = new Date(now.getFullYear() + 1, 0, 1); // 1 января следующего года
  const diffMs = newYear - now;

  const days = Math.floor(diffMs / (1000 * 60 * 60 * 24));
  const hours = Math.floor((diffMs % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
  const minutes = Math.floor((diffMs % (1000 * 60 * 60)) / (1000 * 60));

  return `${days} дней, ${hours} часов, ${minutes} минут`;
}

console.log(timeUntilNewYear());

Советы и частые ошибки

  • Месяцы начинаются с 0. Всегда добавляйте 1 к результату getMonth().
  • Временные зоны. Учитывайте, что методы getXXX() возвращают локальное время, а getUTCXXX()UTC.
  • Високосные годы. При расчете промежутков используйте проверенные библиотеки для сложных вычислений.

Полный курс «JavaScript для начинающих» доступен здесь: https://max-gabov.ru/javascript-dlya-nachinaushih