setInterval работает всего один раз, как решить проблему?

Дано задание. Должен быть таймер в котором каждую минуту должна меняться дата на единицу.

Попробовал реализовать это с помощью setInterval, значение увеличилось на единицу и дальше не идет:

setInterval(updateTime, 1000);


function updateTime() {
  var currentTime = new Date();
  var hours = currentTime.getHours();
  var minutes = currentTime.getMinutes();

  if (minutes < 10) {
    minutes = "0" + minutes;
  }
  var t_str = hours + ":" + minutes + " ";
  if (hours > 11) {
    t_str += "PM";
  } else {
    t_str += "AM";
  }

  document.getElementById('time_span').innerHTML = t_str;
}
var id = setInterval(updateDate, 1000);

function updateDate() {
  var date = new Date();
  var day = date.getDate();
  var month = date.getMonth();
  //var year = date.getYear();
  var fullDate;
  day = Number(day);
  month = Number(month);
  month += 1;
  year = 2021;
  day++;

  if (day < 10 || month < 10) {
    day = "0" + day;
    month = "0" + month;
  }
  if (month == 1 && day == 31 || month == 3 && day == 31 || month == 5 && day == 31 || month == 7 && day == 31 || month == 8 && day == 31 || month == 10 && day == 31 || month == 12 && day == 31) {
    month++;
    day = 1;

  }
  if (month == 4 && day == 30 || month == 6 && day == 30 || month == 9 && day == 30 || month == 11 && day == 30) {
    month++;
    day = 1;
  }
  if (year % 4 == 0 && year % 100 != 0 && year % 400 == 0) {
    if (day == 29 && month == 2) {
      month++;
      day = 1;
    }
  } else {
    if (day == 28 && month == 2) {
      month++;
      day = 1;
    }
  }

  if (month == 12 && day == 31) {
    month = 1;
    day = 1;
    year++;
  }

  fullDate = day + "." + month + "." + year;

  document.getElementById('date_iter').innerHTML = fullDate;
}
<div id="time_span"></div>
<div id="date_iter"></div>

В чем может быть проблема ?


Ответы (2 шт):

Автор решения: Tina Gordienko_Drog

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

let date = 0;
setInterval(() => {
  date++;
  console.log(date);
}, 60000);

→ Ссылка
Автор решения: Макс к

Проблема в том, что ваша функция updateDate при каждом интервальном выполнении, берёт текущую дату, прибавляет к ней 1 и так каждый интервал в функции setInterval(updateDate, 1000); чтобы решить проблему, можно вынести получение текущей даты из функции в глобальный скоуп (например), и оставить там текущую дату. А в теле функции updateDate просто к дате в глобальном скоупе, прибавлять 1 к дню.

Update: Но это будет фикс, только по вашему основному вопросу. Потом обнаружится, что это правило if (day < 10 || month < 10) { day = "0" + day; month = "0" + month; работает только для значений меньше 10, а что делать, когда эти значение больше 10 - не сказано. Ну и так далее уже фиксить, по мере появления проблем. Которые 100% возникнут. PS: var уже давно не используют. Сейчас используют let или const в зависимости от ситуации.

→ Ссылка