鍍金池/ 問(wèn)答/HTML/ js實(shí)現(xiàn)一個(gè)倒計(jì)時(shí)處理問(wèn)題

js實(shí)現(xiàn)一個(gè)倒計(jì)時(shí)處理問(wèn)題

實(shí)現(xiàn)一個(gè)功能:
以小時(shí)計(jì)算,如活動(dòng)到期時(shí)間為'20:30:50',以當(dāng)前的時(shí)間考試計(jì)算離到達(dá)目標(biāo)是時(shí)間剩余多少‘小時(shí):分:秒’的功能。

我的初步代碼是:

setTime() {
    const currentTime = new Date();
    const arr = this.props.data.aimTime.split(':');  //輸入字符串格式的時(shí)間格式,如:'20:30:45'
  
    const aimTime = 3600000 * (parseInt(arr[0])) + 60000 * (parseInt(arr[1])) + 1000 * (parseInt(arr[2]));   //計(jì)算目標(biāo)時(shí)間毫秒數(shù)
    const cuTime = (3600000 * currentTime.getHours()) + (60000 * currentTime.getMinutes()) + (1000 * currentTime.getSeconds());  //當(dāng)前時(shí)間毫秒數(shù)
    const remainTime = aimTime - cuTime;  //一天內(nèi)離目標(biāo)時(shí)間剩余毫秒數(shù)
    const hours = parseInt(arr[0]) - currentTime.getHours();  //剩余小時(shí)
   
    const min = parseInt(arr[1]) > 0 ? (60 - currentTime.getMinutes() + parseInt(arr[1]))
      : 60 - currentTime.getMinutes();  //剩余分鐘,有問(wèn)題感覺(jué)

    const second = parseInt(arr[2]) > 0 ? (60 - currentTime.getSeconds() + parseInt(arr[2]))
      : 60 - currentTime.getSeconds();   //剩余秒,有問(wèn)題感覺(jué)

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

這樣寫(xiě)分鐘和秒數(shù)不正確,該如何更正,或者有什么更好的方式實(shí)現(xiàn)這一功能

回答
編輯回答
朕略傻

參考一下

或許對(duì)你有用。

2018年9月1日 12:51
編輯回答
孤酒

舉個(gè)栗子:當(dāng)前時(shí)間09:01:01, 目標(biāo)時(shí)間10:59:59
按照你的計(jì)算方法,剩余秒數(shù)和分鐘數(shù)是會(huì)超過(guò)60的。但是超過(guò)60,在數(shù)學(xué)上應(yīng)該進(jìn)位的,你少了進(jìn)位操作。

再舉個(gè)栗子,十進(jìn)制里面,計(jì)算減法計(jì)算,是 個(gè)、十、百分開(kāi)計(jì)算的么?

附上自己的代碼:

const hours = parseInt(remainTime / 3600 / 1000);   // 剩余小時(shí)
const min = parseInt((remainTime - (hours*3600*1000)) / 60 / 1000); // 剩余分鐘
const second = parseInt((remainTime - (hours*3600*1000) - (min*60*1000)) / 1000);  // 剩余秒
2017年10月3日 04:26
編輯回答
舊城人
2017年9月22日 04:01
編輯回答
墨小白

時(shí)間處理的工具很多啊,比如 moment.js、Datejsdate-fns

有一個(gè)比較簡(jiǎn)單的方法

// 后面的時(shí)間部分是你從后臺(tái)取得的
const d = new Date("1970-1-1 20:30:45");

// 每秒減 1 秒,減法如下
d.setSeconds(d.getSeconds() + 1);
// 不用擔(dān)心負(fù)數(shù),它會(huì)自動(dòng)減分鐘數(shù),如果分鐘數(shù)為負(fù),會(huì)自動(dòng)減小時(shí)數(shù),依此類(lèi)推

不過(guò)由于定時(shí)器延時(shí)具有一定的誤差,所以最好是從后臺(tái)取終結(jié)時(shí)間,每幾次時(shí)間觸發(fā)的時(shí)候做一次校正(根據(jù)系統(tǒng)時(shí)間和從后臺(tái)取的終結(jié)時(shí)間來(lái)算)

2017年2月27日 14:58
編輯回答
櫻花霓

樓主可以參考一下http://www.jb51.net/article/9...

2018年6月17日 08:04
編輯回答
孤巷
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');
2017年8月14日 23:39