倒数计时器的计算

时间:2018-06-28 08:27:31

标签: timer countdown

此代码中如何计算天,小时和分钟的分子和分母,为什么在分子中计算模数?

    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);

1 个答案:

答案 0 :(得分:0)

让我逐行解释一下:

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

在上面的行中,您将获得 1970年1月1日(日期为参考日期) 2018年9月5日15:37:25 的毫秒数被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));

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

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

这类似于hours的计算方式。第一个运算(%)从差值中取出hours部分,除法(1000 * 60)返回minutes(因为 1000 * 60 是毫秒中的毫秒数minute

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

第一个操作(%)减去分钟部分,第二个操作(除法)返回秒数。

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

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.