var Holiday = []; var WeekendsOff = []; function getHoliday(){ var cacheGetHoliday = null; if(window.globalLocalCache) { cacheGetHoliday = window.globalLocalCache.GetCacheResult( CONF_BACK_SERVERURL+ global.modelctls.calendar.date.getHoliday, "",""); } if(cacheGetHoliday) { var holidays=null; for(var i in cacheGetHoliday){ holidays=cacheGetHoliday[i].DAYS; Holiday.push(holidays); } return; } $.ajax({ type: "POST", async: true, headers:{ "token":$.cookie('ftoken') }, dataType:'json', contentType:"application/json", url: CONF_BACK_SERVERURL+ global.modelctls.calendar.date.getHoliday, crossDomain:true, success:function(data, textStatus, jqXHR) { if(data){ var holidays=null; for(var i in data){ holidays=data[i].DAYS; Holiday.push(holidays); } } if(window.globalLocalCache) { cacheGetHoliday = window.globalLocalCache.AddCache( CONF_BACK_SERVERURL+ global.modelctls.calendar.date.getHoliday, "","",data); } }, error:function(jqXHR, textStatus, errorThrown) { console.log(errorThrown); } }); } 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); }; /** * 功能:计算一段时间内工作的天数。不包括周末和法定节假日,法定调休日为工作日,周末为周六、周日两天; * @param mode mode -推算模式('cn'表示国人习惯【周一至周日】;'en'表示国际习惯【周日至周一】) * @param beginDay -时间段开始日期; * @param endDay 时间段结束日期; * @returns {Number} */ function getWorkDayCount(mode, beginDay, endDay) { beginDay=new Date(beginDay); endDay=new Date(endDay); var begin = new Date(beginDay.toDateString()); var end = new Date(endDay.toDateString()); //每天的毫秒总数,用于以下换算 var daytime = 24 * 60 * 60 * 1000; //两个时间段相隔的总天数 var days = (end - begin) / daytime; //时间段起始时间所在周的第一天 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(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(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; } }); //hepo20160725 将天数+1(解决为0天时改变为1天) days=parseInt(days - weekEndCount)+1; //工作日 = 总天数 - 周末天数(包含法定假日并排除调休日) return days; }; var flag=false; function getAddDate(beginDay,addDay){ var mode = "cn"; var day=addDay; //若输入为当天或者不输入则天数为0 if(addDay==""||addDay-1<1){ day=0; }else{ //由于以下addDays方法不算当天,需求是需要算到当天,所以再减一 day=addDay-1; } beginDay=new Date(beginDay); beginDay=new Date(beginDay.format("yyyy-MM-dd ")); //添加天数后的时间 var endDay=new Date(addDays(beginDay, day)); var dateStr=null; var itemDay=null; var oldday=endDay; endDay=eachHoliday(beginDay,endDay); return endDay.format("yyyy-MM-dd "); } /** * 循环遍历获取节假日周末 * @param beginDay * @param endDay */ function eachHoliday(beginDay,endDay){ var oldday=endDay; var adds=0; var bool=false; $.each(Holiday, function (i, itemHoliday) { if(itemHoliday){ dateStr=itemHoliday.split('-')[0] + "/" + itemHoliday.split('-')[1] + "/" + itemHoliday.split('-')[2]; itemDay = new Date(dateStr); //如果法定假日在时间段区间内,日期自动加1 if (itemDay.getTime() >= beginDay.getTime() && itemDay.getTime() <= endDay.getTime() ) { //若当前日期区间含有节假日 bool=true; adds+=1; } } }); /** * 第一次循环的时候获得的天数加上原来的天数,得到的日期再循环,去掉周末和节假日 * 继续循环,直到不再含有节假日为止 */ endDay=new Date(addDays(endDay, adds)); //因为遍历对比的时候最后一天和第一天都算,若进行多次循环,则第一天会重复进行对比,多余,所以第一天当天不算,加1 oldday=new Date(addDays(oldday, 1)); //说明含有节假日,重新循环对比;若没有 则跳过返回 if(bool){ endDay=eachHoliday(oldday,endDay); } return endDay; } function getHours(beginDay, endDay){ beginDay=new Date(beginDay); endDay=new Date(endDay); var date3=endDay.getTime()-beginDay.getTime() //时间差的毫秒数 //计算出相差天数 var days=Math.floor(date3/(24*3600*1000)) //计算出小时数 var leave1=date3%(24*3600*1000) //计算天数后剩余的毫秒数 var hours=Math.floor(leave1/(3600*1000)) //计算相差分钟数 var leave2=leave1%(3600*1000) //计算小时数后剩余的毫秒数 var minutes=Math.floor(leave2/(60*1000)) //计算相差秒数 var leave3=leave2%(60*1000) //计算分钟数后剩余的毫秒数 var seconds=Math.round(leave3/1000) var times=""; // if(days<=0){ // times= // }else{times=days;} return days; } function addDays(date, num) { date=new Date(date); var targetday_milliseconds = date.getTime() + 1000 * 60 * 60 * 24 * num; date.setTime(targetday_milliseconds); var tYear = date.getFullYear(); var tMonth = date.getMonth(); var tDate = date.getDate(); tMonth = doHandleMonth(tMonth + 1); tDate = doHandleMonth(tDate); tHour = date.getHours(); tMinute = date.getMinutes(); tSecond = date.getSeconds(); tHour = doHandleMonth(date.getHours()); tMinute = doHandleMonth(date.getMinutes()); tSecond = doHandleMonth(date.getSeconds()); return tYear + "-" + tMonth + "-" + tDate + " " + tHour + ":" + tMinute + ":" + tSecond; } function doHandleMonth(month){ var m = month; if(month.toString().length == 1){ m = "0" + month; } return m; } //根据办结日期设置天数 function setDays(endDate){ //清空日期后清空办结天数 longwending 2017.9.23 if(endDate == ""){ $('#officialday').val(""); return; } var startDate=$('#signdate').val(); //var endDate=$('#officialdate').val(); var days=getWorkDayCount('cn', startDate, endDate); if(days<1){ days=getHours(startDate,endDate); } $('#officialday').val(days); } //初始化日期控件 function loadDate(id){ //根据获取到的登记日期,设置办结日期控件最小值为登记日期 jeDate({ dateCell:"#"+id, format:"YYYY-MM-DD", minDate: jeDate.now(0), isinitVal:true, isTime:false, festival: true }) } function setDateRange(startId,endId,pagetype,listType){ //实现日期选择联动 var start = { format: 'YYYY-MM-DD hh:mm:ss', isinitVal: true, //festival:true, // maxDate: $.nowDate({DD:0}), //最大日期 choosefun: function(elem,datas){ end.minDate = datas; //开始日选好后,重置结束日的最小日期 $("#"+endId).jeDate(end); //setDays(datas); }, okfun:function (elem,datas) { // alert(datas) } }; if(listType){//hyh 新增判断,当时从公文查询进来的时候不用时分秒查询 2017/11/28 start = { format: 'YYYY-MM-DD ', //minDate: "2016-06-16", //设定最小日期为当前日期 // isinitVal: true, //festival:true, // maxDate: $.nowDate({DD:0}), //最大日期 choosefun: function(elem,datas){ end.minDate = datas; //开始日选好后,重置结束日的最小日期 setEnddate(); }, okfun:function (elem,datas) { end.minDate = datas; //开始日选好后,重置结束日的最小日期 setEnddate(); } }; } //hzw 2018/5/17 新增 var setEnddate = function () { var startdate = end.minDate; var enddate = document.getElementById(endId).value; startdate = new Date(startdate).getTime(); enddate = new Date(enddate).getTime(); //比较开始和结束日期, 结束日期不能比开始日期打 if(startdate > enddate) { document.getElementById(endId).value = ""; } $("#"+endId).jeDate(end); } var end = { format: 'YYYY-MM-DD', //控件日期格式 //minDate: $.nowDate({DD:0}), //设定最小日期为当前日期 //maxDate: '2099-06-16 23:59:59', //最大日期 clearfun:function(elem, val) { setDays(""); }, choosefun: function(elem,datas){ //start.maxDate = datas; //将结束日的初始值设定为开始日的最大日期 if($('#officialday').val()!="当前用户下该字段不可见"){ setDays(datas); } } }; $("#"+startId).jeDate(start); $("#"+endId).jeDate(end); }