Как прибавить дни к дате в 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() надёжнее.
Ответов пока нет.
Войдите чтобы оставить ответ