2017-05-16 376 views
0

我想制作一个从几小时而不是几天倒计时的JavaScript时钟。我已经使用了一个很好的countdown JS script from Stackoverflow,我正在尝试使代码适应我的喜好。JavaScript时钟,只倒计时小时,分钟和秒..不是天

我的代码:

// CLOCK 
 
var end = new Date(2017,4,22,23,59); 
 
var _second = 1000; 
 
var _minute = _second * 60; 
 
var _hour = _minute * 60; 
 
var _day = _hour * 24; 
 
var timer; 
 

 
function clock() { 
 

 
    var now = new Date(); 
 
    var distance = end - now; 
 

 
    var days = Math.floor(distance/_day); 
 
    // get the total day number example, 3 days 
 
    // times that by 3, so 3x24 = 72 hours 
 
    var plus = days * 24; 
 
    // no make the hours + the days, so 4 hours + 72 etc 
 
    var hours = Math.floor((distance % _day)/_hour + plus); 
 
    var minutes = Math.floor((distance % _hour)/_minute); 
 
    var seconds = Math.floor((distance % _minute)/_second); 
 

 
    console.log('Quick! Get the sale while it lasts') 
 
    console.log(+hours + ' hours remaining..'); 
 
    console.log(+seconds + ' seconds remaining..'); 
 
    console.log(+minutes + ' mins remaining..'); 
 

 
} 
 

 
var countdownTimer = setInterval('clock()', 1000);

如果今天是五月18日,结束日期是20,那么倒计时应该在48小时但它不能正常工作。似乎正在使用旧的2天和15个小时..我不想与天有关。我想要的是几小时而不是几天。

任何指针?

+0

嘛,拿出了'days' ...的小时数仅仅是'距离/ _hour'计算。 – deceze

回答

2

删除任何有(变量,计算)天的依赖关系:

var end = new Date('5/22/2017 11:59 PM'); 
 
var _second = 1000; 
 
var _minute = _second * 60; 
 
var _hour = _minute * 60; 
 

 
function clock(){ 
 
    var now = new Date(); 
 
    var distance = end - now; 
 
    var hours = Math.floor(distance/_hour); 
 
    var minutes = Math.floor((distance % _hour)/_minute); 
 
    var seconds = Math.floor((distance % _minute)/_second); 
 

 
    console.log('Quick! Get the sale while it lasts') 
 
    console.log(hours + ' hours remaining..'); 
 
    console.log(minutes + ' mins remaining..'); 
 
    console.log(seconds + ' seconds remaining..'); 
 
} 
 

 
var countdownTimer = setInterval(clock, 1000);

注意:它被认为是不好的做法,传递一个字符串作为第一个参数setInterval;只需传递函数引用。

你会发现,曾经在一段时间,计数器可跳到第二或可以显示相同的秒数的两倍,因为setInterval不保证通话将由给定的延迟究竟分离。您可以通过计算下一秒何时到期来抵消该影响,并将该动态延迟提供给setTimeout。这里也是一些代码来停止重复一旦目标的时刻到来了:

// CLOCK 
 
var end = new Date('5/22/2017 11:59 PM'); 
 
var _second = 1000; 
 
var _minute = _second * 60; 
 
var _hour = _minute * 60; 
 

 
function clock(){ 
 
    var now = new Date(); 
 
    var distance = end - now; 
 
    if (distance <= 0) { 
 
     console.log('Sorry, sale has ended.') 
 
     return; // stop repeating 
 
    } 
 
    // More precise delay, so you get a tick every second: 
 
    setTimeout(clock, _second*1.5 - now % _second); 
 
    var hours = Math.floor(distance/_hour); 
 
    var minutes = Math.floor((distance % _hour)/_minute); 
 
    var seconds = Math.floor((distance % _minute)/_second); 
 

 
    console.log(hours +':' + ('0' + minutes).substr(-2) 
 
        + ':' + ('0' + seconds).substr(-2) + ' remaining...'); 
 
} 
 

 
clock(); // Just call it

+0

谢谢,也是不好的练习提示!为什么这是不好的做法? – TheBlackBenzKid

+0

这是不好的做法,因为字符串需要在运行时解析,这使得它变得更慢,并且如果它有语法错误,它将不会在代码执行之前浮出水面。 – trincot