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

JavaScript013

如何用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这样就跟我们以前做数学题一个道理了先算出这个至少有几组完整的,然后在算剩下的有几天 实现如下: 以上就是如何计算工作日的两种方法。

//法定节假日和调休日的设定

var Holiday = ["2012-01-01", "2012-01-02", "2012-01-03", "2012-01-22", "2012-01-23", "2012-01-24", "2012-01-25", "2012-01-26", "2012-01-27", "2012-01-28", "2012-04-02", "2012-04-03", "2012-04-04", "2012-04-29", "2012-04-30", "2012-05-01", "2012-06-22", "2012-06-23", "2012-06-24", "2012-09-30", "2012-10-01", "2012-10-02", "2012-10-03", "2012-10-04", "2012-10-05", "2012-10-06", "2012-10-07"]

var WeekendsOff = ["2011-12-31", "2012-01-21", "2012-01-29", "2012-03-31", "2012-04-01", "2012-04-28", "2012-09-29"]

function nearlyWeeks (mode, weekcount, end) {

/*

功能:计算当前时间(或指定时间),向前推算周数(weekcount),得到结果周的第一天的时期值;

参数:

mode -推算模式('cn'表示国人习惯【周一至周日】;'en'表示国际习惯【周日至周一】)

weekcount -表示周数(0-表示本周, 1-前一周,2-前两周,以此推算);

end -指定时间的字符串(未指定则取当前时间);

*/

if (mode == undefined) mode = "cn"

if (weekcount == undefined) weekcount = 0

if (end != undefined)

end = new Date(new Date(end).toDateString())

else

end = new Date(new Date().toDateString())

var days = 0

if (mode == "cn")

days = (end.getDay() == 0 ? 7 : end.getDay()) - 1

else

days = end.getDay()

return new Date(end.getTime() - (days + weekcount * 7) * 24 * 60 * 60 * 1000)

}

function getWorkDayCount (mode, beginDay, endDay) {

/*

功能:计算一段时间内工作的天数。不包括周末和法定节假日,法定调休日为工作日,周末为周六、周日两天;

参数:

mode -推算模式('cn'表示国人习惯【周一至周日】;'en'表示国际习惯【周日至周一】)

beginDay -时间段开始日期;

endDay -时间段结束日期;

*/

var begin = new Date(beginDay.toDateString())

var end = new Date(endDay.toDateString())

//每天的毫秒总数,用于以下换算

var daytime = 24 * 60 * 60 * 1000

//两个时间段相隔的总天数

var days = (end - begin) / daytime + 1

//时间段起始时间所在周的第一天

var beginWeekFirstDay = nearlyWeeks(mode, 0, beginDay.getTime()).getTime()

//时间段结束时间所在周的最后天

var endWeekOverDay = nearlyWeeks(mode, 0, endDay.getTime()).getTime() + 6 * daytime

//由beginWeekFirstDay和endWeekOverDay换算出,周末的天数

var weekEndCount = ((endWeekOverDay - beginWeekFirstDay) / daytime + 1) / 7 * 2

//根据参数mode,调整周末天数的值

if (mode == "cn") {

if (endDay.getDay() >0 &&endDay.getDay() <6)

weekEndCount -= 2

else if (endDay.getDay() == 6)

weekEndCount -= 1

if (beginDay.getDay() == 0) weekEndCount -= 1

}

else {

if (endDay.getDay() <6) weekEndCount -= 1

if (beginDay.getDay() >0) weekEndCount -= 1

}

//根据调休设置,调整周末天数(排除调休日)

$.each(WLD.Setting.WeekendsOff, function (i, offitem) {

var itemDay = new Date(offitem.split('-')[0] + "/" + offitem.split('-')[1] + "/" + offitem.split('-')[2])

//如果调休日在时间段区间内,且为周末时间(周六或周日),周末天数值-1

if (itemDay.getTime() >= begin.getTime() &&itemDay.getTime() <= end.getTime() &&(itemDay.getDay() == 0 || itemDay.getDay() == 6))

weekEndCount -= 1

})

//根据法定假日设置,计算时间段内周末的天数(包含法定假日)

$.each(WLD.Setting.Holiday, function (i, itemHoliday) {

var itemDay = new Date(itemHoliday.split('-')[0] + "/" + itemHoliday.split('-')[1] + "/" + itemHoliday.split('-')[2])

//如果法定假日在时间段区间内,且为工作日时间(周一至周五),周末天数值+1

if (itemDay.getTime() >= begin.getTime() &&itemDay.getTime() <= end.getTime() &&itemDay.getDay() >0 &&itemDay.getDay() <6)

weekEndCount += 1

})

//工作日 = 总天数 - 周末天数(包含法定假日并排除调休日)

return days - weekEndCount

}

法定节假日如果遇到双休日,则双休日顺延或调休,不会被抵消。 法律规定法定假日遇休息日,应当在工作日补假。 根据《全国年节及纪念日放假办法》第六条规定,全体公民放假的假日,如果适逢星期六、星期日,应当在工作日补假。部分公民放假的假...