近期做項目時 客戶提出一個新需求猫十,計劃的工期要去掉雙休日節(jié)假日然爆,因為節(jié)假日的特殊性(由國家規(guī)定,非固定的不好計算浦妄,無法預(yù)測)不做考慮。
下面我們探討下如何將兩個時間段之間的周末去掉
首先一種比較笨的方法是 一天一天去判斷是否是周六或周天见芹,該方法簡單粗暴 主要用 getDay()
去判斷獲得的星期數(shù)是否等于 0
或6
是的話則在周末的天數(shù)累加 最后去開始與結(jié)束日期的差值 扣除 周末總和 就等于工作日啦(PS: 最后日期得加1)剂娄,以下為實現(xiàn)的方法
function stringToDate(dateString){
dateString = dateString.split('-');
return new Date(dateString[0], dateString[1] - 1, dateString[2]);
}
function countWorkDay(date1, date2){
date1 = stringToDate(date1);
date2 = stringToDate(date2);
delta = (date2 - date1) / (1000 * 60 * 60 * 24) + 1; // 計算出總時間
weeks = 0;
for(i = 0; i < delta; i++){
if(date1.getDay() == 0 || date1.getDay() == 6) weeks ++; // 若為周六或周天則加1
date1 = date1.valueOf();
date1 += 1000 * 60 * 60 * 24;
date1 = new Date(date1);
}
return delta - weeks;
}
console.log(countWorkDay('2017-08-01','2017-08-06')); // 4
以上的方法簡單粗暴,但是有個大缺點就是 如果時間跨度比較大玄呛,這邊計算的工作量就比較大了相差一年就得循環(huán)365次了阅懦。所以改進了下方法,我們都知道一周7天徘铝,其中兩天為周末5天為工作日耳胎,那么 一個時間段就可以看成是0-6的循環(huán)即2017-08-01為周二 2017-08-12為周六那么就可以看成2惯吕、3、4怕午、5混埠、6、0诗轻、1钳宪、2、3扳炬、4吏颖、5、6這樣就跟我們以前做數(shù)學(xué)題一個道理了先算出這個至少有幾組完整的恨樟,然后在算剩下的有幾天
實現(xiàn)如下:
function countWorkDay(sDay,eDay){
var s = stringToDate(sDay), e = stringToDate(eDay);
var s_t_w = s.getDay(), e_t_w = e.getDay();
//相差天數(shù)
var diffDay = (e - s) / (1000 * 60 * 60 * 24) + 1;
var diffWeekDay = diffDay - (s_t_w ==0?0:7-s_t_w) + e_t_w;
//計算有幾個完整的周
var weeks = Math.floor(diffWeekDay/7);
if(weeks<=0){ //在同一周內(nèi) 即開始結(jié)束時間不可能同時為周天與周六(周天為一周第一天)
return e_t_w-s_t_w+(s_t_w?1:0)+(e_t_w==6?-1:0);
}else{
return weeks*5 + (e_t_w==6?5:e_t_w) + ( s_t_w >= 1 && s_t_w <= 5 ? (6-s_t_w):0);
}
}
console.log(countWorkDay('2017-08-01','2017-08-06'));
以上就是如何計算工作日的兩種方法半醉。