js 两个时间之间工作日的计算问题(包含节假日)

录用2018年和2019年所有节假日期

 <script>
    let arr = ["2018/01/01", "2018/01/06", "2018/01/07", "2018/01/13", "2018/01/14", "2018/01/20", "2018/01/21", "2018/01/27", "2018/01/28", "2018/02/03", "2018/02/04", "2018/02/10", "2018/02/15", "2018/02/16", "2018/02/17", "2018/02/18", "2018/02/19", "2018/02/20", "2018/02/21", "2018/02/25", "2018/03/03", "2018/03/04", "2018/03/10", "2018/03/11", "2018/03/17", "2018/03/18", "2018/03/24", "2018/03/25", "2018/03/31", "2018/04/01", "2018/04/05", "2018/04/06", "2018/04/07", "2018/04/14", "2018/04/15", "2018/04/21", "2018/04/22", "2018/04/29", "2018/04/30", "2018/05/01", "2018/05/05", "2018/05/06", "2018/05/12", "2018/05/13", "2018/05/19", "2018/05/20", "2018/05/26", "2018/05/27", "2018/06/02", "2018/06/03", "2018/06/09", "2018/06/10", "2018/06/16", "2018/06/17", "2018/06/18", "2018/06/23", "2018/06/24", "2018/06/30", "2018/07/01", "2018/07/07", "2018/07/08", "2018/07/14", "2018/07/15", "2018/07/21", "2018/07/22", "2018/07/28", "2018/07/29", "2018/08/04", "2018/08/05", "2018/08/11", "2018/08/12", "2018/08/18", "2018/08/19", "2018/08/25", "2018/08/26", "2018/09/01", "2018/09/02", "2018/09/08", "2018/09/09", "2018/09/15", "2018/09/16", "2018/09/22", "2018/09/23", "2018/09/24", "2018/10/01", "2018/10/02", "2018/10/03", "2018/10/04", "2018/10/05", "2018/10/06", "2018/10/07", "2018/10/13", "2018/10/14", "2018/10/20", "2018/10/21", "2018/10/27", "2018/10/28", "2018/11/03", "2018/11/04", "2018/11/10", "2018/11/11", "2018/11/17", "2018/11/18", "2018/11/24", "2018/11/25", "2018/12/01", "2018/12/02", "2018/12/08", "2018/12/09", "2018/12/15", "2018/12/16", "2018/12/22", "2018/12/23", "2018/12/30", "2018/12/31", "2019/01/01", "2019/01/05", "2019/01/06", "2019/01/12", "2019/01/13", "2019/01/19", "2019/01/20", "2019/01/26", "2019/01/27", "2019/02/04", "2019/02/05", "2019/02/06", "2019/02/07", "2019/02/08", "2019/02/09", "2019/02/10", "2019/02/16", "2019/02/17", "2019/02/23", "2019/02/24", "2019/03/02", "2019/03/03", "2019/03/09", "2019/03/10", "2019/03/16", "2019/03/17", "2019/03/23", "2019/03/24", "2019/03/30", "2019/03/31", "2019/04/05", "2019/04/06", "2019/04/07", "2019/04/13", "2019/04/14", "2019/04/20", "2019/04/21", "2019/04/27", "2019/04/28", "2019/05/01", "2019/05/04", "2019/05/05", "2019/05/11", "2019/05/12", "2019/05/18", "2019/05/19", "2019/05/25", "2019/05/26", "2019/06/01", "2019/06/02", "2019/06/07", "2019/06/08", "2019/06/09", "2019/06/15", "2019/06/16", "2019/06/22", "2019/06/23", "2019/06/29", "2019/06/30", "2019/07/06", "2019/07/07", "2019/07/13", "2019/07/14", "2019/07/20", "2019/07/21", "2019/07/27", "2019/07/28", "2019/08/03", "2019/08/04", "2019/08/10", "2019/08/11", "2019/08/17", "2019/08/18", "2019/08/24", "2019/08/25", "2019/08/31", "2019/09/01", "2019/09/07", "2019/09/08", "2019/09/13", "2019/09/14", "2019/09/15", "2019/09/21", "2019/09/22", "2019/09/28", "2019/10/01", "2019/10/02", "2019/10/03", "2019/10/04", "2019/10/05", "2019/10/06", "2019/10/07", "2019/10/13", "2019/10/19", "2019/10/20", "2019/10/26", "2019/10/27", "2019/11/02", "2019/11/03", "2019/11/09", "2019/11/10", "2019/11/16", "2019/11/17", "2019/11/23", "2019/11/24", "2019/11/30", "2019/12/01", "2019/12/07", "2019/12/08", "2019/12/14", "2019/12/15", "2019/12/21", "2019/12/22", "2019/12/28", "2019/12/29"];
    function countWorkDay(startTime, endTime) {
      if (startTime === undefined) {
        startTime = new Date();
      } else {
        startTime = startTime.replace('年', '/').replace('月', '/').replace('日', '');  //将时间格式转化为2019/02/10的格式
      }
      if (endTime === undefined) {
        endTime = new Date();
      } else {
        endTime = endTime.replace('年', '/').replace('月', '/').replace('日', '');  //将时间格式转化为2019/02/10的格式
      }
      var start_time = new Date(startTime);
      var end_time = new Date(endTime);
      var time = end_time.getTime() - start_time.getTime();      //计算两个时间的毫秒差
      var days = parseInt(time / (1000 * 60 * 60 * 24));             //根据毫秒差计算得到相差天数
      if (days < 0) {                                                                      //实际业务需要,某个时间不能小于某个时间,否则给出错误提示
        return days;
      }
      days += 1;                                                                          // 实际业务需要计算天数(当天也算一天)
      for (var i = 0; i < arr.length; i++) {                            //获取两个时间之间的工作日天数
        var holidaytime = new Date(arr[i]).getTime();
        if (holidaytime >= start_time.getTime() && holidaytime <= end_time.getTime()) {    //如果两个时间之间包含节假日期就减去那天,得到需要的工作日天数
          days -= 1;
        }
      }
      return days;
    }
    let startTime = '2018/01/07'
    let endTime = '2018/01/01'
    let days = countWorkDay(startTime, endTime)
    console.log('days', days);
  </script>

参考地址:http://www.manongjc.com/article/56428.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以帮您编写这个函数。不过在计算两个时间段内排除节假日时间之前,我们需要先确定节假日时间范围。因为不同国家和地区的节假日不同,所以需要根据具体情况来确定。这里我们假设您已经有了一份有效的节假日列表,可以用数组的形式存储,例如: ```javascript const holidays = [ '2022-01-01', '2022-01-02', '2022-01-03', '2022-02-01', '2022-02-02', '2022-02-03', // ... ]; ``` 接下来,我们可以编写一个函数来计算两个时间段内排除节假日时间。假设这两个时间段分别为 `start` 和 `end`,函数的代码如下: ```javascript function calculateWorkingTime(start, end, holidays) { // 转换为时间戳 start = new Date(start).getTime(); end = new Date(end).getTime(); // 计算两个时间之间的毫秒数 let diff = end - start; // 计算排除节假日后的毫秒数 for (let i = start; i < end; i += 86400000) { let date = new Date(i).toISOString().slice(0, 10); if (holidays.indexOf(date) !== -1) { diff -= 86400000; } } // 转换为小时数 return diff / 3600000; } ``` 这个函数的核心是使用一个循环,每次加一天的毫秒数(86400000),并检查这一天是否是节假日。如果是节假日,则从总毫秒数中减去一天的毫秒数。最后将排除节假日后的毫秒数转换为小时数,并返回结果。 您可以这样调用这个函数: ```javascript const start = '2022-01-01 09:00:00'; const end = '2022-01-03 18:00:00'; const result = calculateWorkingTime(start, end, holidays); console.log(result); // 输出:15 ``` 这个例子中,假设工作时间从 2022 年 1 月 1 日 9 点到 2022 年 1 月 3 日 18 点,共计 33 个小时。但由于 2022 年 1 月 1 日、1 月 2 日、1 月 3 日都是节假日,因此需要排除这三天的时间,最终计算出的工作时间为 15 个小时。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值