Таймеры и обратный отсчёт в JavaScript

Таймер позволяет запустить код через некоторое время или повторять его с заданным интервалом. Для этого используют setTimeout() и setInterval().

setTimeout() и setInterval()

setTimeout() запускает функцию один раз после задержки.

setTimeout(() => {
  console.log('Прошло две секунды');
}, 2000);

setInterval() запускает функцию повторно через указанный промежуток времени. Он возвращает идентификатор таймера, который нужен для остановки.

const timerId = setInterval(() => {
  console.log('Проверяем время');
}, 1000);

setTimeout(() => {
  clearInterval(timerId);
}, 5000);

Задержка указывается в миллисекундах: 1000 - одна секунда.

Обратный отсчёт до даты

Создадим элемент для вывода таймера.

<p id="timer"></p>

В переменной deadline хранится момент окончания. При каждом обновлении вычитаем из него текущее время.

const timerElement = document.querySelector('#timer');
const deadline = new Date(2026, 11, 31, 0, 0).getTime();

function updateCountdown() {
  const difference = deadline - Date.now();

  if (difference <= 0) {
    clearInterval(timerId);
    timerElement.textContent = 'Время вышло';
    return;
  }

  const totalSeconds = Math.floor(difference / 1000);
  const days = Math.floor(totalSeconds / 86400);
  const hours = Math.floor((totalSeconds % 86400) / 3600);
  const minutes = Math.floor((totalSeconds % 3600) / 60);
  const seconds = totalSeconds % 60;

  timerElement.textContent = `${days} д. ${String(hours).padStart(2, '0')} ч. ${String(minutes).padStart(2, '0')} мин. ${String(seconds).padStart(2, '0')} сек.`;
}

const timerId = setInterval(updateCountdown, 1000);

updateCountdown();

Функция вызывается сразу, поэтому пользователь не ждет первую секунду. Когда дата наступит, clearInterval() остановит таймер.

Почему нужна дата окончания

Не стоит просто уменьшать переменную каждую секунду. Вкладка может быть неактивной, и браузер начнет вызывать функцию реже. Тогда отсчёт будет неточным.

В примере каждый раз вычисляется разница между deadline и Date.now(). Поэтому после возвращения на вкладку таймер сразу покажет правильное оставшееся время.