根据开始日期和工作日得到结束时间(排除周末,及节假日,调休)功能点实现记录。。。。
难点分析:
1.自动过滤周末以及节假日(这个容易实现)
2.周末可能是节假日
3.周末可能正常上班
4.工作日可能放假
PS:当这几种情况全部展现的时候也是比较棘手的。。。。
第一种实现方式:用递归的方式实现(存在的问题:比当前时间多1天)比如:2020-1-1号请假一天结束日期未2020-1-2,因为截止日期循环的话每次回多加一个T(代表一天)试了很多办法没能解决。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
//获取当前系统时间 var current_time = times(); var arrHoliday=new Array();//声明一个节假日数组 //获取节假日 $.ajax({ url: "${ctx}/oa/holiday/holiday/recordInYear?date=" + current_time, method: 'get', dataType: 'json', async: false,//同步请求 success: function (data) { if (data.success) { $(data.list).each(function (i, record) { if (record.workRest == "2") { var data=record.recordDate; var strs= new Array(); //定义一数组 strs=data.split("-"); //字符分割 var n=strs[0]; var y=strs[1]; //分割后的字符输出 var r=strs[2]; if (y< 10) { y = y.replace(/^0/, '');//去掉月份前面的0 } if (r < 10) { r = r.replace(/^0/, ''); } var data=n + "/" + y + "/" + r; arrHoliday.push(data);//形成一个节假日数组 } }); } } }); var min_days = getWorkDate(current_time,"5"); debugger; /** * @param {date} startDate 当前时间 * @param {string} limitDay 工作日 */ function getWorkDate(startDate,limitDay){ var time = Date.parse(startDate); var startTime = new Date(Date.parse(startDate)); var startTime = startTime.getTime(); var T = 24*60*60*1000; var endTime = startTime+(limitDay*T); if(limitDay>0){ var holidays = 0; for(var i=startTime+T;i<=endTime;i+=T){ var date = new Date(i); if(date.getDay()==0 || date.getDay()==6){ holidays++; } var value=date.toLocaleDateString(); strs=value.split(" "); //字符分割 去掉分钟秒 var _date=strs[0]; if(isInArray(arrHoliday,_date) == true){ holidays++; } } return getWorkDate(new Date(endTime),holidays); }else{ return startDate.toLocaleDateString(); } } /** * 使用循环的方式判断一个元素是否存在于一个数组中 * @param {Object} arr 数组 * @param {Object} value 元素值 */ function isInArray(arr,value){ for(var i = 0; i < arr.length; i++){ if(value === arr[i]){ return true; } } return false; } |
方式二:暂时没发现问题
简单说下实现思路:定义两个变量:count 用来统计当前时间是不是工作日 workday 表示请假的天数(工作日)
如果当前时间是工作日则加一,不是则继续循环。当count等于请假天数的时候则结束循环。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
function addDate(dateTemp,days){ var dateTemp = dateTemp.split("-"); var nDate = new Date(dateTemp[1] + '-' + dateTemp[2] + '-' + dateTemp[0]); //转换为MM-DD-YYYY格式 var millSeconds = Math.abs(nDate) + (days * 24 * 60 * 60 * 1000); var rDate = new Date(millSeconds); var year = rDate.getFullYear(); var month = rDate.getMonth() + 1; if (month.length==1) month = "0" + month; var date = rDate.getDate(); if (date.length==1) date = "0" + date; return (year + "-" + month + "-" + date); } function getWorkDate(beginDate, workDay) { var begin = beginDate; var count = 0; for(var i = 0;i<365;i++){ beginDate = addDate(begin,i); var arys1= new Array(); arys1=beginDate.split('-'); var ssdate=new Date(arys1[0],parseInt(arys1[1]-1),arys1[2]); var day = ssdate.getDay(); if(day==6 || day==0){ //是周末 不是调休 是节假日 if(WeekendsOff.toString().indexOf(beginDate)==-1){ continue; }else{ count++; } }else{ if(arrHoliday.toString().indexOf(beginDate)!=-1){ continue; }else{ count++; } } if(count==workDay) break; }; return beginDate; }; |