@rak123

Почему неправильно вычисляется дата в цикле?

Почему если прибавлять дату вне цикла, она складывается корректно, а если перебирать через for, после 21 итерации выдает неправильное значение даты?
var startDate = new Date(2019, 7, 11);
var qqq = new Date(2019, 7, 11);
 var day = qqq.setDate(startDate.getDate() + 23);
    console.log(startDate);
console.log(qqq);
console.log(day);

var startDate = new Date(2019, 7, 11);
var qqq = new Date(2019, 7, 11);
 var day = qqq.setDate(startDate.getDate() + 24);
    console.log(startDate);
console.log(qqq);
console.log(day);

var startDate = new Date(2019, 7, 11);
var qqq = new Date(2019, 7, 11);
 var day = qqq.setDate(startDate.getDate() + 25);
    console.log(startDate);
console.log(qqq);
console.log(day);

var startDate = new Date(2019, 7, 11);
        var qqq = new Date(2019, 7, 11);
      
        for (var i = 0;i <= 30;i++) {  
                var day = qqq.setDate(startDate.getDate() + i);
                console.log(startDate);
                console.log(qqq);
                console.log(i);
          
        }
  • Вопрос задан
  • 735 просмотров
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
после 21 итерации выдает неправильное значение даты

Правильное. Что написали - то и получаете.

Вы пляшете от 11 числа, а в августе 31 день. 11 + 21 = 32, такого числа нет, так что месяц изменяется на сентябрь. Дальше 11 + 22, а дата-то после предыдущей итерации цикла сентябрьская. Так что получить вы пытаетесь 33 уже не августа, а сентября. Такой даты тоже не бывает, месяц меняется на октябрь. Ну и так далее - на каждой итерации прыгаете на месяц с лишним вперёд.

Как избавиться от лишнего перехода к следующему месяцу?

Первый вариант - устанавливать в качестве числа месяца не стартовое значение + счётчик цикла, а текущее + 1:

const startDate = new Date(2019, 7, 11);
const currentDate = new Date(startDate);

for (let i = 0; i <= 30; i++) {  
  currentDate.setDate(currentDate.getDate() + 1);
  console.log(currentDate);
}

Второй вариант - создавать на каждой итерации цикла новый объект даты вместо изменения уже существующего:

const startDate = new Date(2019, 7, 11);

for (let i = 0; i <= 30; i++) {  
  const currentDate = new Date(startDate);
  currentDate.setDate(startDate.getDate() + i);
  console.log(currentDate);
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@strelok011
Есть отличная библиотека, облегчающая работу с датами https://momentjs.com/docs/
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы