公司項目最近有個需求,要統計人員有多少天沒使用工作系統。
原本只是簡單地將當前時間與最后使用時間相減,得到的天數做為未使用的天數。
結果,領導說這樣不行,需要計算得精確些,於是上網搜到不少解決方案,不是通過循環解決,就是都不符合我們的實際情況,便自己寫一個。
項目是jQuery的,所以循環語句也需要自己改一下。希望對同樣需求的兄弟姐妹們有所幫助,也希望大家多多拍磚,提點意見哈!
//法定節假日和調休日的設定
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;
};