js 计算时间差

3,743 阅读3分钟

需求

计算当前时间与今天早上八点的时间差, 若是当前时间在八点之前,则返回"00:00:00",否则返回时间差"hh:mm:ss"

分析

刚看到这个问题我的第一反应就是 , 首先得到当前时间 , 然后得到"今天八点",两者相减即可得到时间差

解决

原本是只有法一的, 但是后来灵机一动 , 结果出来了法二 , 就因为灵机一动 , 让我明白了 , 我就是个弟弟.....看官请往下看

  • 法一 :算出毫秒差 , 然后依次求出这个差值包含了多少个小时 + 多少分钟 + 多少秒 获取当前时间 : Date.now()
    获取今天八点 : new Date().setHours(8,0,0,0)顺便解释一下这个Api 设置指定时间小时字段(第一个参数是小时字段 , 第二个参数是分钟字段 , 依次是秒 , 毫秒). 指定时间也就是 new Date() , 小时字段也就是这个时间的小时字段, 看下面这段代码

实验代码

let millisec = new Date().setHours(8,0,1,0);//返回毫秒数 1630800001000
console.log(new Date(millisec).toLocaleString())//结果是 '2021/9/5 上午8:00:01'

好了既然八点解决了, 那问题便解决一大半(我是这么认为的嘿嘿嘿)

实施

function getDifferenceTime(){
    let nowTime = Date.now();//获取当前时间对应的毫秒数
    let eightTime = new Date().setHours(8,0,0,0);//获取八点对应的毫秒数
    let differenceTime = nowTime-eightTime;
    if(differenceTime <= 0){
        return "00:00:00"
    }else{
        //求出当前时间差对应的秒数 , 结果就是 n 秒 余 m 毫秒
        let seconds = Math.floor(differenceTime / 1000);
        //求出当前时间差对应的分钟数 , 并求出余下的秒数
        let minutes = Math.floor(seconds / 60);
        let remainSec = seconds % 60;//余下的秒数
        //求出当前时间差对应的小时数 , 并求出余下的分钟数
        let hours = Math.floor(minutes / 60);
        let remainMin = minutes % 60;
        //返回值
        return `${hours.toString().padStart(2 , "0")}:${remainMin.toString().padStart(2,"0")}:${remainSec.toString().padStart(2,"0")}`
    }
    
}
console.log(getDifferenceTime());//08:07:55

OK!!!大功告成

  • 法二 可是.......突然一个想法冒上心头: 我们都知道js中 new Date()可以根据传入的毫秒数生成一个距1970年1月1日0点0分0秒0毫秒的日期 , 正数代表这个时间点之后的日期 , 负数代表这个时间点之前的的数据 , 那我们是不是可以直接将时间差传入,直接读出时间差生成的时间小时数,分钟数,秒数 , 然后拼接,这不就万事大吉了么:

实施

function getDifferenceTime(){
    let nowTime = Date.now();//获取当前时间对应的毫秒数
    let eightTime = new Date().setHours(8,0,0,0);//获取八点对应的毫秒数
    let differenceTime = nowTime-eightTime;
    if(differenceTime <= 0){
        return "00:00:00"
    }else{
        let diffDate = new Date(differenceTime);
        let hours = diffDate.getHours();
        let minutes = diffDate.getMinutes();
        let seconds = diffDate.getSeconds();
        return `${hours.toString().padStart(2,"0")}:${minutes.toString().padStart(2,"0")}:${seconds.toString().padStart(2,"0")}`
    }
    
}

自信满满的以为 , 稳了 , 我真牛皮 , 结果打印:
console.log(getDifferenceTime())//16:27:23
我当时一度愣在当场 , 正好是我下午的时间 , emmmmm,这他喵的 , 思路没错呀 ,咋肥四, 左思右想 , 冥思苦想 , 想想想 ...裂开 !
就这样时间到了第二天上午 , 午休后 , 就那么突然蹦起来 , 脑海里不断重复 , 传入经过的时间毫秒数 , 得出 1970年1月1日后在格林威治经过了多久 , 呕吼!!!!!!!!!!!!!
格林威治 划重点!!!!!!!对啦 , 要把自己放在格林威治才可以 , 当我们new Date()对象的时候 , 得到的时间是js自动帮我们转化成东八区的时间了,测试: new Date(1000)得到Thu Jan 01 1970 08:00:01 GMT+0800 (中国标准时间)
那如何把自己放在格林威治呢 , hhhhhhh感谢高一地理老师 , 因为我们使用的是东八区的标准时间我们只需要在传入的时间差减去八个小时就可以了 , 若是我们在西时区就需要加上对应的小时:

再次实施

function getDifferenceTime(){
    let nowTime = Date.now();//获取当前时间对应的毫秒数
    let eightTime = new Date().setHours(8,0,0,0);//获取八点对应的毫秒数
    let differenceTime = nowTime-eightTime;
    if(differenceTime <= 0){
        return "00:00:00"
    }else{
        let diffDate = new Date(differenceTime - 8*60*60*1000);
        let hours = diffDate.getHours();
        let minutes = diffDate.getMinutes();
        let seconds = diffDate.getSeconds();
        return `${hours.toString().padStart(2,"0")}:${minutes.toString().padStart(2,"0")}:${seconds.toString().padStart(2,"0")}`
    }
    
}
console.log(getDifferenceTime())//08:43:29 完美!!!!!!!

其实这只是我当时的心路历程这篇文章是我今天下午写的 , 同志们对具体的时间结果便不用太过较真.
这是我在掘金的第一篇文章希望可以对各位掘金的朋友有那么一丢丢的帮助 , 谢谢!!