calculateTime.js 10.4 KB
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);
}