倒数计时器的计算

Calculation of countdown timer

这段代码中天、时、分的分子和分母是怎么计算的,为什么分子中要计算模数?

    var countDownDate = new Date("Sep 5, 2018 15:37:25").getTime();

    var x = setInterval(function() {  
        var now = new Date().getTime();      
        var distance = countDownDate - now;      
        var days = Math.floor(distance / (1000 * 60 * 60 * 24));
        var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
        var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
        var seconds = Math.floor((distance % (1000 * 60)) / 1000);

        document.getElementById("demo").innerHTML = days + "d " + hours + "h " + minutes + "m " + seconds + "s ";

       if (distance < 0) {
          clearInterval(x);
          document.getElementById("demo").innerHTML = "EXPIRED";
       }

    }, 1000);

让我逐行解释:

var countDownDate = new Date("Sep 5, 2018 15:37:25").getTime();

在上面的行中,您将获得日期 2018 年 9 月 5 日 15:37:251970 年 1 月 1 日[=49] 的毫秒数=](这是 getTime()

使用的参考日期
var now = new Date().getTime();      
var distance = countDownDate - now;      

上面两行很简单。 now获取当前时间,单位为毫秒,distance为两个时间之差(也是毫秒)

var days = Math.floor(distance / (1000 * 60 * 60 * 24));

一天的总秒数是60 * 60 * 24,如果我们想得到毫秒数,我们需要将它乘以1000所以数字1000 * 60 * 60 * 24 是一天的总毫秒数。将差值(距离)除以这个数字并丢弃小数点后的值,我们得到天数。

var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));

由于有两个操作,上面的行有点诡异。第一个操作(%)是用来基本舍弃代表天数的差分(%returns除法的余数所以取出差分的days部分。 在下一步(除法)中,1000 * 60 * 60是一个小时的总毫秒数。因此,将差值的余数除以这个数字将得到 hours 的数字(就像我们丢弃小数点后的数字之前一样)

var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));

这类似于 hours 的计算方式。第一个操作(%)从差分中取出hours部分,除法(1000*60)returnsminutes(如1000*60minute)

中的毫秒数
var seconds = Math.floor((distance % (1000 * 60)) / 1000);

这里第一个运算(%)取出分钟部分,第二个运算(除法)returns秒数

注意:您可能已经注意到,在每个操作中都使用原始距离,但代码仍然可以正常工作。让我举个例子(我用 difference 而不是 distance 因为这个名字更有意义)。

difference = 93234543
days =  Math.floor(89234543 / (1000 * 60 * 60 * 24)) 
=> days = 1
hours = Math.floor((89234543 % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
(result of modulus operation is 6834543, and division is )
=> hours = 1

This is a very important operation to understand:
var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));

distance(difference) / (1000 * 60 * 60) returns 25 (hours). As you can see we have already got 1 day and 1 hour (25 hours) so distance % (1000 * 60 * 60) wipes out all of these 25 hours and then the division calculates the minutes and so on.