秒杀倒计时跟本地时间一直有不到一秒的误差

秒杀倒计时跟本地时间一直有不到一秒的误差

如题,调了很久一直有误差,不知道什么原因

代码

<!DOCTYPE html>
<html>
   <head>
      <meta charset="utf-8">
      <title>实现秒杀倒计时</title>
      <script>
         window.addEventListener('DOMContentLoaded', function() {
            function getCountdown() {
               let hourSpan = document.querySelector('.hour');
               let minSpan = document.querySelector('.minute');
               let secondSpan = document.querySelector('.second');
               let timeIntervalByMillisecond = new Date('2023-8-31 23:50:00') - new Date();
               let timeInterval = Math.floor(timeIntervalByMillisecond/1000);
               let timeErrorValue = timeIntervalByMillisecond % 1000;
               let hour = Math.floor(timeInterval/3600);
               let min = Math.floor(timeInterval/60-hour*60);
               let second = timeInterval-hour*3600-min*60;
               hourSpan.innerHTML = hour.toString().padStart(2, '0');
               minSpan.innerHTML = min.toString().padStart(2, '0');
               secondSpan.innerHTML = second.toString().padStart(2, '0');
               if (hour + min + second > 0) {
                  return timeErrorValue;
               }
               else {
                  return false;
               }
            }
            function getCountdownAuto() {
               let timesUp = getCountdown();
               if (timesUp === false) {
                  window.clearInterval(Countdown);
               }
            }
            let correctionTime = 1000 - getCountdown();
            let initializeCountdown = window.setTimeout(getCountdown, correctionTime);
            window.clearTimeout(initializeCountdown);
            let Countdown = window.setInterval(getCountdownAuto, 1000);
            let stopTimer = document.getElementsByTagName('button')[0];
            stopTimer.addEventListener('click', function () {
               window.clearInterval(Countdown);
            });

         });
      </script>
      <style>
         span {
            display: inline-block;
            width: 100px;
            height: 100px;
            background-color: black;
            color: white;
            line-height: 100px;
            text-align: center;
            font-size: 40px;
         }
      </style>
   </head>
   <body>
      <button>停止定时器</button>
      <div>
         <span class="hour">10</span>
         <span class="minute">20</span>
         <span class="second">30</span>
      </div>
   </body>
</html>


正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学,你好!计时器函数(例如setTimeoutsetInterval)不是完全准确的。javaScript是单线程的脚本语言当计时器的回调函数执行时间超过了设定的时间间隔时,就会导致计时器循环的误差。可能会有误差,也有可能会受到浏览器性能的影响造成误差

祝学习愉快~

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师