不计算两个日期之间的假期或周末
Do not count given holidays or weekends between two dates
我已经在我的js文件中包含了给定的代码
$( '.dateDisable' ).change(function() {
calculateDays();
});
function calculateDays() {
var first = new Date( $( '#start_date' ).val() ),
last = new Date( $( '#end_date' ).val() ),
daysDiff = leaveCalculation( first,last);
}
function leaveCalculation( d1, d2 ) {
alert(gon.holiday) // 2015-08-28,2015-09-25,2016-08-31,2016-08-07,2015-08-13,2016-08-29,2016-01-07,2015-09-08
var weeks, dateDiff, weekDay1, weekDay2;
if ( d2 < d1 ) return -1;
weekDay1 = d1.getDay(),
weekDay2 = d2.getDay();
weeks = Math.floor( ( d2.getTime() - d1.getTime() ) / 604800000 );
if ( weekDay1 <= weekDay2 )
dateDiff = ( weeks * 5 ) + ( weekDay2 - weekDay1 );
else
dateDiff = ( ( weeks + 1 ) * 5 ) - ( weekDay1 - weekDay2 );
return ( dateDiff + 1 );
}
我想计算天数。
如果我选择了日期" 2015年8月27日"-" 2015年8月31日"它将计算daysDiff = 3,但我想取出daysDiff,就好像在2015年8月28日有假期一样,因为我在gon.holiday
中获取假期禁用日期。在我的例子中是
2015-08-28, 2015-09-25, 2016-08-31, 2016-08-07, 2015-08-13, 2016-08-29, 2016-01-07, 2015-09-08
因此,如果我选择了日期" 2015年8月27日"-" 2015年8月31日",那么它将给我daysDiff为2,因为28,29,30已经是假期了。我也想排除周末
我该怎么做呢?
像这样
var gon = {};
gon["holiday"] = "2015-08-28,2015-09-25,2016-08-31,2016-08-07,2015-08-13,2016-08-29,2016-01-07,2015-09-08".split(",");
// 2 helper functions - moment.js is 35K minified so overkill in my opinion
function pad(num) { return ("0" + num).slice(-2); }
function formatDate(date) { var d = new Date(date), dArr = [d.getFullYear(), pad(d.getMonth() + 1), pad(d.getDate())];return dArr.join('-');}
function calculateDays(first,last) {
var aDay = 24 * 60 * 60 * 1000,
daysDiff = parseInt((last.getTime()-first.getTime())/aDay,10)+1;
if (daysDiff>0) {
for (var i = first.getTime(), lst = last.getTime(); i <= lst; i += aDay) {
var d = new Date(i);
if (d.getDay() == 6 || d.getDay() == 0 // weekend
|| gon.holiday.indexOf(formatDate(d)) != -1) {
daysDiff--;
}
}
}
return daysDiff;
}
// ONLY using jQuery here because OP already used it. I use 1.11 so IE8+
$(function() {
var days = calculateDays(new Date($('#start_date').val()),
new Date($('#end_date').val()));
if (days <= 0) {
alert("Please enter an end date after the begin date");
}
else {
alert(days +" working days found");
}
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<input id="start_date" value="27 August, 2015" />
<input id="end_date" value="31 August, 2015" />
这可以很容易地通过Moment.js实现:
var startString = "2015-01-01";
var endString = "2015-02-20";
var holidaysString = "2015-01-03, 2015-01-15, 2015-02-05, 2015-03-01";
var start = moment(startString);
var end = moment(endString);
var holidays = holidaysString.split(',').map(function(str) {
return moment(str);
});
var getDuration = function getDuration(start, end, holidays) {
var overlappingDays = holidays.reduce(function(count, holiday) {
return count + ~~(holiday.isAfter(start) && holiday.isBefore(end));
}, 0);
var diff = end.diff(start, 'days');
return diff - overlappingDays;
};
output.innerHTML = getDuration(start, end, holidays);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.10.6/moment.min.js"></script>
<span id="output"></span> days.
你可以计算这些天之间的天数
然后将进入gon.holiday
的日期字符串拆分为数组
然后循环遍历这个数组,如果它们在两个日期之间,则减去天数
function calculateDays(){
var first = new Date( '27 August, 2015'),
last = new Date('31 August, 2015'),
daysDiff = leaveCalculation( first,last);
}
function leaveCalculation( d1, d2 ) {
var holidayArr = [];
var holiday = gon.holiday; //"2015-08-28,2015-09-25,2016-08-31,2016-08-07,2015-08-13,2016-08-29,2016-01-07,2015-09-08";
if ( d2 < d1 ) return -1;
var oneDay = 24*60*60*1000;
var difDays = Math.round(Math.abs((d1.getTime() - d2.getTime())/(oneDay))); //find the number of days between the two dates
var holidayArr = holiday.split(','); //split at ,
for(var i=0; i<holidayArr.length;i++){ //loop through array
if(new Date(holidayArr[i]) <= d2 && new Date(holidayArr[i]) >= d1){ //check if two dates are between the given dates
difDays-=1;
}
}
return difDays;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
相关文章:
- 函数参数中的数据与指定变量之间的任何性能差异
- 全局变量和全局对象的属性之间有什么区别吗
- java.net和javascript之间正则表达式的差异
- JavaScript中的函数和对象之间没有区别吗?
- 获取@ResponseBody的一部分作为主干和Spring MVC控制器之间的参数
- Jquery在函数之间传递表行
- 根据某些条件在视图之间切换
- 在控制器和数据对象之间同步数据
- d3中堆栈函数和嵌套函数之间的差异
- JQuery:在页面之间滑动
- 如何使用JavaScript查找1和N之间的所有数字的总和
- 操作放置在画布上的元素之间的连接
- 在下划线中使用_(obj).map(callback)和_.map(obj,callback)之间的区别
- jquery在表单之间切换
- Nodejs API控制器,用于在API之间切换
- 如何在aspx页面之间传递参数
- 在索引.html和应用.js [node.js] 之间共享变量
- 什么是&&在没有if的行中的变量之间
- 我如何使用javascript返回两个日期之间的天数假期不包括假期
- 不计算两个日期之间的假期或周末