Avatar ·

Как прибавить дни к дате в JavaScript? Подробное решение

Всем привет! Я новичок в JavaScript и столкнулся с проблемой при работе с датами. Мне нужно реализовать функционал, где пользователь вводит количество дней, и на основе текущей даты вычисляется новая дата через это количество дней. Например, сегодня 15 марта 2025 года, пользователь вводит 10, и я должен получить 25 марта 2025 года. Я пытался сделать это так: ```javascript let today = new Date(); let daysToAdd = 10; let futureDate = today + daysToAdd; console.log(futureDate); // Выводит что-то странное типа "Fri Mar 14 2025 12:30:00 GMT+030010" ``` Но это не работает — результат выглядит как мусор. Я понимаю, что просто складывать дату и число нельзя, но не знаю правильного подхода. Пробовал искать в документации, но запутался в методах Date. Подскажите, пожалуйста, как правильно прибавить дни к дате в JavaScript? Желательно с понятными примерами. Заранее спасибо! <<>>

Правильный способ прибавления дней к дате через setDate()

Основная проблема в вашем коде — попытка сложить объект Date с числом. JavaScript в этом случае преобразует объект в строку, а затем выполняет конкатенацию, что даёт бессмысленный результат. Для работы с датами нужно использовать встроенные методы объекта Date.

Самый надёжный и простой способ — метод setDate(). Он устанавливает день месяца (от 1 до 31) для указанной даты по местному времени. Ключевая особенность: если передать значение, выходящее за пределы текущего месяца, JavaScript автоматически пересчитает дату в следующий месяц или даже год.

Вот как это работает пошагово:

// 1. Создаём текущую дату
let today = new Date();
console.log('Сегодня:', today);

// 2. Получаем текущий день месяца
let currentDay = today.getDate();

// 3. Прибавляем нужное количество дней
let daysToAdd = 10;
let newDay = currentDay + daysToAdd;

// 4. Устанавливаем новый день
today.setDate(newDay);
console.log('Через 10 дней:', today);

Можно записать компактнее:

let date = new Date();
date.setDate(date.getDate() + 10);
console.log(date); // Дата через 10 дней

Почему это работает корректно?

JavaScript автоматически обрабатывает переполнение месяцев и годов. Например:

  • Если сегодня 28 января, а мы прибавляем 5 дней, получим 2 февраля
  • Если сегодня 30 декабря, а мы прибавляем 10 дней, получим 9 января следующего года
  • Если сегодня 28 февраля 2024 года (високосный), прибавление 2 дней даст 1 марта

Пример с проверкой на практике

function addDays(date, days) {
    let result = new Date(date); // Копируем, чтобы не мутировать исходную дату
    result.setDate(result.getDate() + days);
    return result;
}

// Тесты
let startDate = new Date('2025-03-28');
console.log(addDays(startDate, 5));  // 2025-04-02 (переход в апрель)
console.log(addDays(startDate, -10)); // 2025-03-18 (отрицательное значение — вычитание)
console.log(addDays(startDate, 365)); // 2026-03-28 (следующий год)

Важные замечания

  • Мутация исходного объекта: метод setDate() изменяет исходный объект Date. Если нужно сохранить оригинальную дату, создавайте копию через new Date(date)
  • Отрицательные значения: можно передавать отрицательные числа для вычитания дней
  • Часовые пояса: метод работает с местным временем пользователя. Для UTC используйте setUTCDate()
  • Производительность: этот способ работает за O(1) и не требует дополнительных вычислений

Этот подход считается стандартным и рекомендуется в официальной документации MDN. Он поддерживается во всех браузерах и средах Node.js.

<<>>

Альтернативный подход: работа с миллисекундами

Можно прибавлять дни, конвертируя дату в миллисекунды и обратно. Один день — это 24 * 60 * 60 * 1000 = 86 400 000 миллисекунд.

function addDaysByMs(date, days) {
    let ms = date.getTime(); // получаем timestamp в миллисекундах
    let dayInMs = 24 * 60 * 60 * 1000;
    let newMs = ms + days * dayInMs;
    return new Date(newMs);
}

let today = new Date();
let future = addDaysByMs(today, 10);
console.log(future);

Плюсы:

  • Не мутирует исходный объект (возвращает новую дату)
  • Интуитивно понятно математически

Минусы:

  • Не учитывает переход на летнее/зимнее время. В дни перевода часов день может быть 23 или 25 часов, что приведёт к ошибке в 1 час
  • Может дать сбой при работе с датами до 1970 года или после 2038 года (проблема 32-битных систем)

Этот метод стоит использовать только если вы точно знаете, что часовые пояса не влияют на результат (например, при работе с UTC). В большинстве случаев setDate() надёжнее.