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