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 шт):
вот рабочий код, сравните с тем, что вы написали
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 в зависимости от ситуации.