@FIain

Как исправить неправильную разницу в таймере?

Сделал простой таймер и логика такая, что при ms > 3_600_000, а это значит ms > 1 часа, в объект добавляется поле hour и hourCycle ( необязательно ). В моём примере отсчет должен начинаться с 1 часа и 10 секунд, но почему-то начинается с 4 часов и 10 секунд. В чем может быть ошибка?

const pizzaTimer = (ms) => {
  const target = new Date().getTime() + ms + 100; // 100 это смещение для setInterval, так-как setInterval не всегда точно спустя 1 секунду обновляется
  const interval = setInterval(() => {
    if (ms > 3_600_000) {
      console.log(
        new Intl.DateTimeFormat(navigator.language, {
          hourCycle: 'h23',
          hour: 'numeric',
          minute: 'numeric',
          second: 'numeric',
        }).format(target - new Date().getTime())
      );
    } else {
      console.log(
        new Intl.DateTimeFormat(navigator.language, {
          minute: 'numeric',
          second: 'numeric',
        }).format(target - new Date().getTime())
      );
    }
  }, 1000);

  setTimeout(() => {
    console.log('pizza time');
    clearInterval(interval);
  }, ms);
};

console.log(pizzaTimer(3_610_000));
  • Вопрос задан
  • 72 просмотра
Пригласить эксперта
Ответы на вопрос 1
i229194964
@i229194964
Веб разработчик
const pizzaTimer = (ms) => {
  const target = new Date().getTime() + ms + 100; // 100 это смещение для setInterval, так-как setInterval не всегда точно спустя 1 секунду обновляется
  const interval = setInterval(() => {
    const remainingTime = target - new Date().getTime(); // Вычисление оставшегося времени в миллисекундах

    if (ms > 3_600_000) {
      console.log(
        new Intl.DateTimeFormat(navigator.language, {
          hourCycle: 'h23',
          hour: 'numeric',
          minute: 'numeric',
          second: 'numeric',
        }).format(remainingTime)
      );
    } else {
      console.log(
        new Intl.DateTimeFormat(navigator.language, {
          minute: 'numeric',
          second: 'numeric',
        }).format(remainingTime)
      );
    }
  }, 1000);

  setTimeout(() => {
    console.log('pizza time');
    clearInterval(interval);
  }, ms);
};

console.log(pizzaTimer(3_610_000));
Ответ написан
Ваш ответ на вопрос

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

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