如何用js计算工作日(去掉周六周日)

JavaScript08

如何用js计算工作日(去掉周六周日),第1张

近期做项目时 客户提出一个新需求,计划的工期要去掉双休日节假日,因为节假日的特殊性(由国家规定,非固定的不好计算,无法预测)不做考虑。 下面我们探讨下如何将两个时间段之间的周末去掉 首先一种比较笨的方法是 一天一天去判断是否是周六或周天,该方法简单粗暴 主要用 getDay() 去判断获得的星期数是否等于 0 或 6 是的话则在周末的天数累加 最后去开始与结束日期的差值 扣除 周末总和 就等于工作日啦(PS: 最后日期得加1),以下为实现的方法 以上的方法简单粗暴,但是有个大缺点就是 如果时间跨度比较大,这边计算的工作量就比较大了相差一年就得循环365次了。所以改进了下方法,我们都知道一周7天,其中两天为周末5天为工作日,那么 一个时间段就可以看成是0-6的循环即2017-08-01为周二 2017-08-12为周六那么就可以看成2、3、4、5、6、0、1、2、3、4、5、6这样就跟我们以前做数学题一个道理了先算出这个至少有几组完整的,然后在算剩下的有几天 实现如下: 以上就是如何计算工作日的两种方法。

下面的算法是,2009年的第1周是从第一个星期一开始,就是1月5日。不然2009年的第1周的星期一,会跑到2008年12月去了。

<script>

fun(2008, 30)//2008年的第30周

function fun(year, week) {

var d = new Date(year, 0, 1)

var time = d.getTime()

var t = week * 7 * 24 * 3600 * 1000

time += t

d = new Date(time)

var w = d.getDay()

var d1 = new Date(time - (w - 1) * 24 * 3600 * 1000)

var d2 = new Date(time + ((7 - w) * 24 * 3600 * 1000))

print(d1)

print(d2)

}

function print(d) {

var y = d.getFullYear()

var m = d.getMonth() + 1

m = m <10 ? "0" + m : "" + m

var day = d.getDate()

day = day <10 ? "0" + day : "" + day

var weekDay = d.getDay()

var wk = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"]

alert(y + "-" + m + "-" + day + " " + wk[weekDay])

}

</script>

//起始日期也在计算范围内

function getRestDays(bd,ed)

{

   var d1=new Date(bd),d2=new Date(ed)

   var dateSpan=d2-d1

   var days=parseInt(dateSpan/(24*3600*1000))+1//计算两个日期间的天数差,加1是为了把起始日期计算在内

   var weeks=parseInt(days/7,10)

   var result=weeks*2

   if(days%7>0)

   {

      var leftdays=days%7

      var week1=d1.getDay() //周日=0,周一=1,依次。。       

      if(week1==0)//如果第一个日期从周日开始,剩余天数不足一周(7天)

      {

result +=1

      }

      else if(week1+leftdays>7)//如果第一个日期从周一到周六,加上剩余天数大于7,表示包含周六和周日,所以有两天

      {

         result +=2

      }

      else if(week1+leftdays==7)//如果刚好到周六,有一天休息日

      {

         result +=1

      }

   }

   return result

}

执行结果可以自测,调用如下: