calculateTime.js
10.6 KB
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
341
342
343
344
345
346
347
348
349
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);
}