Math.round((tSecs-30)/60)
соответствует Math.floor(tSecs / 60)
. Вообще Math.round(x - 0.5) === Math.floor(x)
. Автор кода этого не знает, выкручивается как умеет.
Из-за setTimeout
время на экране обновляется чуть реже чем раз в секунду и иногда будет пропущена очередная секунда - время обновится через две секунды. У setInterval
будет другая проблема: если вам не повезло и таймер запущен ровно на границе секунды, время на экране будет регулярно перескакивать через две секунды. Вероятность такой неудачи 1/1000, но она есть. Думается, для счётчика пребывания на странице лучше поведение с setTimeout
.
P.S. Есть способ в котором таймер тикает почти гарантированно равномерно. Для этого в setTimeout
подставляется такой интервал, что в следующий раз мы окажемся в начале секунды:
const timerCounter = startDate => {
const start = startDate.getTime();
const span = document.getElementById('timer-counter');
const format = n => {
const s = n.toString();
return (s.length === 1) ? '0' + s : s;
}
const tick = () => {
const interval_ms = new Date().getTime() - start;
const interval_s = Math.floor(interval_ms / 1000);
const mins = format(Math.floor(interval_s / 60));
const secs = format(interval_s % 60);
span.textContent = `Вы находитесь на сайте: ${mins}:${secs} минут/секунд.`;
setTimeout(tick, 10 + 1000 - interval_ms % 1000);
};
tick();
};
timerCounter(new Date());
<span id="timer-counter"></span>