/[原创]JS端计算一段时间内工作日的天数,排除周末和法定节假日,同时考虑到调休日
公司项目最近有个需求,要统计人员有多少天没使用工作系统。
原本只是简单地将当前时间与最后使用时间相减,得到的天数做为未使用的天数。
结果,领导说这样不行,需要计算得精确些,于是上网搜到不少解决方案,不是通过循环解决,就是都不符合我们的实际情况,便自己写一个。
项目是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;
};
分享到:
相关推荐
java计算整年工作日(包含特殊的工作日)排除法定节假日和周末能运行
在IT行业中,尤其是在数据分析、报表生成或项目管理等领域,经常需要计算特定日期范围内的工作日,即排除周末和国家法定节假日。这样的需求可以应用于多种场景,例如计算员工的工作天数、项目的进度安排或是金融市场...
压缩包里有2个文件,用于计算两个日期相差的工作日天数(排除周末和法定节假日): 1、excel表为2023年日历数据,并且备注工作日、周末,调休、节假日类型,可导入数据库。 2、SQL文件为2023年所有日期的插入SQL,并...
计算某个日期加上几个工作日后的一个工作日期(除周末和法定节假日),计算某个日期后一天的工作日期(除周末和法定节假日),计算两个日期的真实工作日(除周末和法定节假日),判断一个日期是否是夏季时间,计算两个时间...
在编程领域,尤其是在数据分析...通过以上步骤,我们可以编写出一个高效且准确的函数,计算两个日期之间的工作日差,同时考虑到节假日和周末的排除。这个功能在项目中有着广泛的应用,例如在项目管理和财务分析等领域。
1、excel表数据为2022年周末休息日和法定节假日数据,并且备注周末和节假日类型,可导入数据库,用于计算两个日期相差的工作日天数(排除周末和法定节假日)。 2、SQL文件为2022年所有日期,并标注:工作日、法定节...
计算有效工时,工作日,休息日等工具,可排除 法定假日,周末上班,周末等,内含多种测试用例,计算有效工时,工作日,休息日等工具,可排除 法定假日,周末上班,周末等,内含多种测试用例
本人编写,通过自己定义的函数计算两个日期之间周末的天数和工作日天数,经过测试,非常好用
1. **工作日**:一般指的是周一至周五的工作时间,不包括周末和法定节假日。 2. **SQL函数**:用于执行特定任务的预定义SQL语句集合。在这个场景中,我们关注的是一个名为`fn_WorkDay`的用户自定义函数。 3. **...
获取当年中国的法定节假日和工作日等信息。 如下是当前包含的功能: * 01-给定日期,判断是否是休息日(包含法定节假日和不需要补班的周末)。 * 02-给定日期,判断是否是工作日(非休息日)。 * 03-获取一年中总共...
此excel表数据为2021年周末和法定节假日数据,并且备注周末和节假日类型,可导入数据库,用于计算两个日期相差的工作日天数(排除周末和法定节假日)
C# 计算两日期的工作时间间隔(排除非工作日)及计算下一个工作时间点 本文将详细介绍使用 C# 语言计算两日期之间的工作时间间隔,并排除非工作日。同时,也会计算下一个工作时间点。 日期时间处理 在 C# 中,...
计算除周六日、法定节假日以外两个日期之间的间隔天数
### 知识点详解 #### 一、计算两个日期间的工作日数量 ...综上所述,这段代码提供了计算两个日期间工作日数量的一种实现方法,通过调整日期、计算总天数、排除周末和节假日等方式实现了功能需求。
表可能包含以下字段:日期(DATE类型)、工作日标识(BOOLEAN,表示是否为工作日)、周末标识(BOOLEAN,表示是否为周末)、节假日标识(BOOLEAN,表示是否为法定节假日)等。 4. **Java数据库连接**: 使用JDBC...
计算两个日期相隔天数并减去节假日,这个可以使用在各种需要通知的场景以及工作日提醒等
java代码先获取全年的周末周日,定义全年的法定节假日,然后根据输入的日期计算,当前日期后的工作日,也可以用于计算工作日
在每个月,考虑到周末和法定节假日,实际工作天数可能少于日历天数。Java提供了`YearMonth`类来处理月份,结合`DayOfWeek`可以判断是否为工作日。以下代码示例展示了如何计算一个月的工作日: ```java import java....
在Excel中,内置的工作日计算函数默认是按照双休日(即周末为周六和周日)来计算工作日的。但在某些情况下,比如在特定的企业或机构中采用的是单休制度(即每周只休息一天),这时就需要对工作日的计算方法进行调整...
Excel单元格双击自动调整及单击自动恢复行高——赠送自动目录序号、需求跟踪矩阵模板