setTimeout延时多久,不一定到时间后就会立即执行,所以需要来修正 setTimeout的时间,使其相对时间是准确的。

    1. let period = 60 * 1000 * 60 * 2
    2. let startTime = new Date().getTime()
    3. let count = 0
    4. let end = new Date().getTime() + period
    5. let interval = 1000
    6. let currentInterval = interval
    7. function loop() {
    8. count++
    9. // 代码执行所消耗的时间
    10. let offset = new Date().getTime() - (startTime + count * interval);
    11. let diff = end - new Date().getTime()
    12. let h = Math.floor(diff / (60 * 1000 * 60))
    13. let hdiff = diff % (60 * 1000 * 60)
    14. let m = Math.floor(hdiff / (60 * 1000))
    15. let mdiff = hdiff % (60 * 1000)
    16. let s = mdiff / (1000)
    17. let sCeil = Math.ceil(s)
    18. let sFloor = Math.floor(s)
    19. // 得到下一次循环所消耗的时间
    20. currentInterval = interval - offset
    21. console.log('时:'+h, '分:'+m, '毫秒:'+s, '秒向上取整:'+sCeil, '代码执行时间:'+offset, '下次循环间隔'+currentInterval)
    22. setTimeout(loop, currentInterval)
    23. }
    24. setTimeout(loop, currentInterval)