js实现一个倒计时处理问题

实现一个功能:
以小时计算,如活动到期时间为'20:30:50',以当前的时间考试计算离到达目标是时间剩余多少‘小时:分:秒’的功能。

我的初步代码是:

setTime() {
    const currentTime = new Date();
    const arr = this.props.data.aimTime.split(':');  //输入字符串格式的时间格式,如:'20:30:45'
  
    const aimTime = 3600000 * (parseInt(arr[0])) + 60000 * (parseInt(arr[1])) + 1000 * (parseInt(arr[2]));   //计算目标时间毫秒数
    const cuTime = (3600000 * currentTime.getHours()) + (60000 * currentTime.getMinutes()) + (1000 * currentTime.getSeconds());  //当前时间毫秒数
    const remainTime = aimTime - cuTime;  //一天内离目标时间剩余毫秒数
    const hours = parseInt(arr[0]) - currentTime.getHours();  //剩余小时
   
    const min = parseInt(arr[1]) > 0 ? (60 - currentTime.getMinutes() + parseInt(arr[1]))
      : 60 - currentTime.getMinutes();  //剩余分钟,有问题感觉

    const second = parseInt(arr[2]) > 0 ? (60 - currentTime.getSeconds() + parseInt(arr[2]))
      : 60 - currentTime.getSeconds();   //剩余秒,有问题感觉

    
    remainTime > 0 &&
      this.setState({
        hours: hours > 9 ? hours : '0' + hours,
        min: min > 9 ? min : '0' + min,
        second: second > 9 ? second : '0' + second,
      });
  }

这样写分钟和秒数不正确,该如何更正,或者有什么更好的方式实现这一功能

阅读 4.4k
6 个回答

举个栗子:当前时间09:01:01, 目标时间10:59:59
按照你的计算方法,剩余秒数和分钟数是会超过60的。但是超过60,在数学上应该进位的,你少了进位操作。

再举个栗子,十进制里面,计算减法计算,是 个、十、百分开计算的么?

附上自己的代码:

const hours = parseInt(remainTime / 3600 / 1000);   // 剩余小时
const min = parseInt((remainTime - (hours*3600*1000)) / 60 / 1000); // 剩余分钟
const second = parseInt((remainTime - (hours*3600*1000) - (min*60*1000)) / 1000);  // 剩余秒
function formatTime(t){
    t=t.toString();
    return t[1] ? t : '0'+t
}
function countDown(t){
    var maxTime=(new Date(t).getTime())-Date.now();
    if(maxTime>0){
        var h=parseInt(maxTime/(60*60*1000));
        var m=parseInt(maxTime/(60*1000)%60);
        var s=parseInt(maxTime/(1000)%60);
        var time=[h,m,s].map((el)=>formatTime(el)).join(':');
        console.log(time)
        setTimeout(countDown,1000,t);
    }else{
        console.log('timeout')
    }
}
countDown('2018-04-17 18:00:00');

时间处理的工具很多啊,比如 moment.jsDatejsdate-fns

有一个比较简单的方法

// 后面的时间部分是你从后台取得的
const d = new Date("1970-1-1 20:30:45");

// 每秒减 1 秒,减法如下
d.setSeconds(d.getSeconds() + 1);
// 不用担心负数,它会自动减分钟数,如果分钟数为负,会自动减小时数,依此类推

不过由于定时器延时具有一定的误差,所以最好是从后台取终结时间,每几次时间触发的时候做一次校正(根据系统时间和从后台取的终结时间来算)

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题