Blame view

src/main/webapp/js/projecttask/calculateTime.js 10.4 KB
caiyongsong committed
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 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340
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);
		}
	});
//	$.post(CONF_BACK_SERVERURL+ global.modelctls.calendar.date.getholiday,{},
//			 function (result) {
//			if(result){
//				var holidays=null;
//				for(var i in result){
//					holidays=result[i].DAYS;
//					Holiday.push(holidays);
//				//	Holiday.push(new Date(result[i].DAY).format("yyyy-MM-dd hh:mm:ss"));
//				}
//				//Holiday.push("2016-12-31");
//				// alert(JSON.stringify(Holiday));
//				
//			 }
//	});
}
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,suptotaltime){
	var mode = "cn"; 
	var day=addDay;
	//若输入为当天或者不输入则天数为0
	if(addDay==""||addDay <0){
		day=0;
	}
	/*else{
		//由于以下addDays方法不算当天,需求是需要算到当天,所以再减一
		day=addDay-1;
	}*/
	beginDay=new Date(beginDay);
	// beginDay=new Date(beginDay.format("yyyy-MM-dd hh:mm:ss"));
	//添加天数后的时间
	var endDay=new Date(addDays(beginDay, day,suptotaltime));
	var dateStr=null;
	var itemDay=null;
	var oldday=endDay;
	endDay=eachHoliday(beginDay,endDay);

	
	
	return endDay.format("yyyy-MM-dd hh:mm:ss");
}
/**
 * 循环遍历获取节假日周末
 * @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,0));
	//因为遍历对比的时候最后一天和第一天都算,若进行多次循环,则第一天会重复进行对比,多余,所以第一天当天不算,加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,suptotaltime) {
	date=new Date(date);
    var targetday_milliseconds = date.getTime() + 1000 * 60 * 60 * 24 * num;
    targetday_milliseconds = targetday_milliseconds + (suptotaltime?suptotaltime * 1000:0);
    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){
	//实现日期选择联动
	var start = {
	    format: 'YYYY-MM-DD',
//	    minDate: "2016-06-16", //设定最小日期为当前日期
	    isinitVal: true,
	    //festival:true,
	   // maxDate: $.nowDate({DD:0}), //最大日期
	    choosefun: function(elem,datas){
	        end.minDate = datas; //开始日选好后,重置结束日的最小日期
	         setDays(datas);
	    },
	    okfun:function (elem,datas) {
//	        alert(datas)
	    }
	};
	var end = {
	    format: 'YYYY-MM-DD',
	    minDate: $.nowDate({DD:0}), //设定最小日期为当前日期
	    //festival:true,
//	    maxDate: '2099-06-16 23:59:59', //最大日期
	    clearfun:function(elem, val) {
	    	setDays("");
	    },
	    choosefun: function(elem,datas){
//	        start.maxDate = datas; //将结束日的初始值设定为开始日的最大日期
	        setDays(datas);
		       //若为公文查询高级查询,则还要初始化其他的查询条件
		        // if(pagetype=="search"){
		        	 	//setDateRange("officialdate","officialdate1","search");
			       // } 
	    }
	};
//	function endDates() {
//	    end.trigger = false;
//	    $("#"+endId).jeDate(end);
//	}
	$("#"+startId).jeDate(start);
	$("#"+endId).jeDate(end);
}