我有一个代码,它返回使用jquery datapicker选择的两个日期之间的天数。
我想为假期添加一个函数,它将排除数组中的所有假日; var假期[25-12-2016,26-12-2016,1-1-2017];
请找到以下代码:
<script>
<!--Calculate Leave days excluding weekends
function calcBusinessDays(start, end) {
// This makes no effort to account for holidays
// Counts end day, does not count start day
// make copies we can normalize without changing passed in objects
var start = new Date(start);
var end = new Date(end);
// initial total
var totalBusinessDays = 0;
// normalize both start and end to beginning of the day
start.setHours(0,0,0,0);
end.setHours(0,0,0,0);
var current = new Date(start);
current.setDate(current.getDate() + 1);
var day;
// loop through each day, checking
while (current <= end) {
day = current.getDay();
if (day >= 1 && day <= 5) {
++totalBusinessDays;
}
current.setDate(current.getDate() + 1);
}
return totalBusinessDays;
}
$(function() {
$( "#start_date" ).datepicker({ minDate:0, showOn: 'button', buttonImageOnly: true, buttonImage: 'images/calendar.png', beforeShowDay: $.datepicker.noWeekends });
$( "#end_date" ).datepicker({ minDate:0, showOn: 'button', buttonImageOnly: true, buttonImage: 'images/calendar.png',beforeShowDay: $.datepicker.noWeekends,
onSelect: function (dateStr) {
var max = $(this).datepicker('getDate'); // Get selected date
$('#datepicker').datepicker('option', 'maxDate', max || '+1Y+12M'); // Set other max, default to +18 months
var start = $("#start_date").datepicker("getDate");
var end = $("#end_date").datepicker("getDate");
var days = (end - start) / (1000 * 60 * 60 * 24);
var diff = calcBusinessDays(start,end);
$("#leave_days").val(diff);
} });
});
</script>
<input name="start_date" type="text" id="start_date" />
<input name="end_date" type="text" id="end_date" />
<input name="leave_days" type="text" id="leave_days" size="32" class="form-control"/>
答案 0 :(得分:0)
您可以使用此逻辑:
将周末作为中间假期
function workingDaysBetweenDates(startDate, endDate) {
var millisecondsPerDay = 86400 * 1000;
startDate.setHours(0,0,0,1);
endDate.setHours(23,59,59,999);
var diff = endDate - startDate;
var days = Math.ceil(diff / millisecondsPerDay);
// Subtract two weekend days for every week in between
var weeks = Math.floor(days / 7);
days = days - (weeks * 2);
// Handle special cases
var startDay = startDate.getDay();
var endDay = endDate.getDay();
// Remove weekend not previously removed.
if (startDay - endDay > 1)
days = days - 2;
// Remove start day if span starts on Sunday but ends before Saturday
if (startDay === 0 && endDay != 6)
days = days - 1 ;
// Remove end day if span ends on Saturday but starts after Sunday
if (endDay === 6 && startDay !== 0)
days = days - 1 ;
return days;
}
var a = new Date(2015, 10, 16);
var b = new Date(2016, 01, 20);
var t = workingDaysBetweenDates(a,b);
alert(t);
希望这有帮助!
答案 1 :(得分:0)
如评论中所述,您必须定义假日数组。
在本例中,我定义了两个日期:2016-11-23和2016-12-02
您可以使用数据库或在脚本中手动执行,以便随时间保持相关日期 这部分没有在这里解释,但在脚本中,我使用了the default MySQL date format,即YYYY-MM-DD。 从数据库中获取假日日期应该很容易。
另外一个函数用于将current
日期转换为此MySQL日期格式,以便进行比较。
然后,在while
循环中,我们检查日期是否为假日,如果是,则设置条件中使用的布尔标志以添加&#34;营业日&#34;或不到柜台。
var holiday_array=["2016-11-23", "2016-12-02"]; // YYYY-MM-DD (Default MySQL date format)
function dateToMySQL (x){
var MySQL_day = x.getDate();
if(MySQL_day<10){
MySQL_day = "0"+MySQL_day; // Leading zero on day...
}
var MySQL_month = x.getMonth()+1; // Months are zero-based.
if(MySQL_month<10){
MySQL_month = "0"+MySQL_month; // Leading zero on month...
}
var MySQL_year = x.getYear()+1900; // Years are 1900 based.
var MySQL_date = MySQL_year+"-"+MySQL_month+"-"+MySQL_day;
return MySQL_date;
}
function calcBusinessDays(start, end) {
// This makes no effort to account for holidays
// Counts end day, does not count start day
// make copies we can normalize without changing passed in objects
var start = new Date(start);
var end = new Date(end);
// initial total
var totalBusinessDays = 0;
// normalize both start and end to beginning of the day
start.setHours(0,0,0,0);
end.setHours(0,0,0,0);
// Prepare loop's variables
var current = new Date(start);
current.setDate(current.getDate() + 1);
var day;
var holidayFound=false;
// loop through each day, checking
while (current <= end) {
//console.log("current: "+current);
// Check if current is in the holiday array
var MySQLdate = dateToMySQL(current);
console.log("MySQL date: "+MySQLdate);
if($.inArray(MySQLdate,holiday_array)!=-1){
console.log(" ^----------- Holiday!!!");
holidayFound=true; // "flag"
}
// If current is monday to friday and NOT a holiday
day = current.getDay();
if (day >= 1 && day <= 5 && !holidayFound) {
++totalBusinessDays;
}
// For next iteration
current.setDate(current.getDate() + 1);
holidayFound=false;
}
return totalBusinessDays;
}
$(function() {
$( "#start_date" ).datepicker({
minDate:0,
showOn: 'button',
buttonImageOnly: true,
buttonImage: 'http://www.nscale.net/forums/images/misc/Tab-Calendar.png', //'images/calendar.png',
beforeShowDay: $.datepicker.noWeekends
});
$( "#end_date" ).datepicker({
minDate:0,
showOn: 'button',
buttonImageOnly: true,
buttonImage: 'http://www.nscale.net/forums/images/misc/Tab-Calendar.png', //'images/calendar.png',
beforeShowDay: $.datepicker.noWeekends,
onSelect: function (dateStr) {
var max = $(this).datepicker('getDate'); // Get selected date
$('#datepicker').datepicker('option', 'maxDate', max || '+1Y+12M'); // Set other max, default to +18 months
var start = $("#start_date").datepicker("getDate");
var end = $("#end_date").datepicker("getDate");
var days = (end - start) / (1000 * 60 * 60 * 24);
var diff = calcBusinessDays(start,end);
$("#leave_days").val(diff);
}
});
});
请参阅CodePen (检查控制台;))