OBKoro1 / web_accumulate

前端进阶积累:http://obkoro1.com/web_accumulate/accumulate/
245 stars 73 forks source link

计算两个时间的时间差&时区转换 | effect #238

Open OBKoro1 opened 5 years ago

OBKoro1 commented 5 years ago

博客链接

计算两个时间的时间差&时区转换

计算两个时间的时间差:

  1. 获取两个时间数据,通常这两个时间是:后端给的时间数据和当前时间

    let dateBegin = '2018/08/28 04:56:38'; // 初始时间
    dateBegin = new Date(dateBegin);
    // Mon Aug 28 2017 04:56:38 GMT+0800 (中国标准时间)
    // 上面是Date对象的数据形式
    let dateEnd = new Date(); // 第二个数据通常是当前时间
    
  2. 使用getTime()返回与固定的 1970 年 1 月 1 日的时间差,再用大的时间减去短的时间即可得出双方相差的毫秒数。

    let dateDiff = dateEnd.getTime() - dateBegin.getTime();
    
  3. 换算成你想要的时间单位,得出两个时间的时间差。

    // 计算出相差天数
    let dayDiff = Math.floor(dateDiff / (24 * 3600 * 1000));
    
    // 计算天数后剩余的毫秒数 利用这个时间去计算小时
    let leave1 = dateDiff % (24 * 3600 * 1000);
    // 计算出小时数
    let hours = Math.floor(leave1 / (3600 * 1000));
    // 计算相差分钟数
    let leave2 = leave1 % (3600 * 1000); // 计算小时数后剩余的毫秒数
    let minutes = Math.floor(leave2 / (60 * 1000)); // 计算相差分钟数
    // 计算相差秒数
    let leave3 = leave2 % (60 * 1000); // 计算分钟数后剩余的毫秒数
    let seconds = Math.round(leave3 / 1000);
    
    // 结果
    console.log(`相差${dayDiff}${hours}小时${minutes}分钟${seconds}秒`);
    

如果你只想计算相差的小时数,不想管天数:

let dayDiff = Math.floor(dateDiff / (3600 * 1000)); // 其他的同理,倍数正确即可

时区转换

需求

拿到这么一串字符串:2018-09-17,要与当前的日期比较,求出日期差。

let time = `2018-09-17`;
let dateBegin = new Date(time);
let dateEnd = new Date(); // 这一秒的时间 需重新设置
dateEnd.setHours(0, 0, 0, 0);
// 计算时间差 参照上文

东八区的时间

上面new Date(time)之后拿到的是零时区 0 点的时间,在东八区也就是北京时间08:00:00

而我们第二个时间设置的是北京时间00:00:00,这里面就出现了八个小时的误差。

转换时区的三种方法

  1. 设置世界时为当前时区的时间:

    设置具体的时间,传进new Date()的时候会自动转成北京时间00:00:00,然后两个时间就可以同步了。

    let time = `2018-09-17`;
    time = `${time} 00:00:00`; // 后面加上具体时间
    let dateBegin = new Date(time);
    let dateEnd = new Date(); // 这一秒的时间 需重新设置
    dateEnd.setHours(0, 0, 0, 0);
    // 计算时间差 参照上文
    

    也可以使用setHours

    let time = `2018-09-17`;
    let dateBegin = new Date(time);
    dateBegin.setHours(0, 0, 0, 0); // new Date()之后 设为0点 两个时间同步
    let dateEnd = new Date(); // 这一秒的时间 需重新设置
    dateEnd.setHours(0, 0, 0, 0);
    // 计算时间差 参照上文
    
  2. 当前时区与世界时同步:

    let time = `2018-09-17`;
    let dateBegin = new Date(time);
    let dateEnd = new Date(); // 这一秒的时间 需重新设置
    dateEnd.setHours(8, 0, 0, 0); // 设置为八点与世界时一致
    // 计算时间差 参照上文
    
  3. 你可能不知道当前时区与世界时相差多少

    let time = `2018-09-17`;
    let dateBegin = new Date(time);
    let dateEnd = new Date(); // 这一秒的时间 需重新设置
    dateEnd.setUTCHours(0, 0, 0, 0); // 设置为世界时的0点 也就是北京时间八点
    // 计算时间差 参照上文
    

以上:2018.09.21

点个Star支持我一下~

博客链接