Проблема с прибавлением дней к дате в JavaScript, а вычитание работает нормально

Описание проблемы

У меня есть форма с двумя полями “Дата начала” и “Дата окончания”, оба используют виджет jQuery Datepicker. Эти поля выбираются пользователем и показывают начальную и конечную даты отчета. Также есть параметр “Диапазон дней” - это максимальное количество дней между этими датами.

Когда пользователь меняет дату в одном поле, я пересчитываю параметры “minDate” и “maxDate” для виджета Datepicker в другом поле. Это ограничивает варианты выбора для пользователя. Для этих расчетов нужно прибавлять и вычитать дни от даты.

Суть проблемы

Вычитание дней работает правильно, а прибавление дней дает неверные результаты. Я использую функцию setDate(), как советуют в примерах:

resultDate.setDate(resultDate.getDate() + 7);

Вот примеры того, что происходит (формат даты ДД/ММ/ГГГГ):

01/01/2025 + 0 дней  = 10/01/2025 = +9 дней   = Неверно
01/01/2025 + 1 день   = 11/01/2025 = +10 дней  = Неверно
01/01/2025 + 9 дней   = 19/01/2025 = +18 дней  = Неверно
01/01/2025 + 10 дней  = 20/04/2025 = +109 дней = Неверно

01/01/2025 - 0 дней  = 01/01/2025 = -0 дней  = Верно
01/01/2025 - 1 день   = 31/12/2024 = -1 день   = Верно
01/01/2025 - 9 дней   = 23/12/2024 = -9 дней   = Верно
01/01/2025 - 10 дней  = 22/12/2024 = -10 дней  = Верно

Пример кода

var formatDate = "dd/mm/yy";

$(document).ready(function() {
  $("#PlusBtn").click(function() {
    var currentDate = $.datepicker.parseDate(
      formatDate,
      document.getElementById("StartDate").value
    );
    var dayCount = document.getElementById("DaysRange").value;
    currentDate = increaseDays(currentDate, dayCount);
    var finalDate = $.datepicker.formatDate(formatDate, currentDate);
    document.getElementById("FinalDate").value = finalDate;
  });

  $("#MinusBtn").click(function() {
    var currentDate = $.datepicker.parseDate(
      formatDate,
      document.getElementById("StartDate").value
    );
    var dayCount = document.getElementById("DaysRange").value;
    currentDate = decreaseDays(currentDate, dayCount);
    var finalDate = $.datepicker.formatDate(formatDate, currentDate);
    document.getElementById("FinalDate").value = finalDate;
  });
});

var dateField = $("#StartDate").datepicker({
  changeYear: true,
  changeMonth: true,
  dateFormat: formatDate,
});

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

function decreaseDays(date, days) {
  const resultDate = new Date(date);
  resultDate.setDate(resultDate.getDate() - days);
  return resultDate;
}
<p>Дни: <input type="text" value="10" id="DaysRange" /></p>
<p>Дата: <input type="text" id="StartDate" autocomplete="off" /></p>
<input type="button" value="Прибавить дни" id="PlusBtn" />
<input type="button" value="Вычесть дни" id="MinusBtn" />
<p>Результат: <input type="text" id="FinalDate" value="" disabled /></p>

В чем может быть проблема с прибавлением дней?

тоже сталкивался с этим! поле ввода всегда возвращает строку, даже цифры. при сложении js думает что это склейка строк - “1” + “10” = “110”. а вычитание автоматом конвертирует в числа. проще всего - добавь плюс перед переменной: resultDate.setDate(resultDate.getDate() + +days). выглядит дико, но работает на ура

Проблема в том, что document.getElementById("DaysRange").value возвращает строку, не число. Когда делаешь resultDate.getDate() + days со строкой “10”, JavaScript склеивает их как строки вместо сложения. getDate() возвращает 1, плюс “10” = “110”, и setDate ставит 110-й день года.

Исправь так:

function increaseDays(date, days) {
  const resultDate = new Date(date);
  resultDate.setDate(resultDate.getDate() + parseInt(days));
  return resultDate;
}

Или просто используй +days для быстрого преобразования в число.

Ага, точно проблема с типами! У меня так было - забыл что инпуты всегда строки возвращают. Минус работает потому что JS при вычитании сам конвертит в число, а плюс думает что строки склеиваешь. Попробуй Number(days) вместо parseInt - тоже норм работает.