我正在尝试创建一个排除周末和节假日的函数。我试图在从今天起 30 天后的文本框中显示。一旦 30 天循环检查那一天,如果选择下一个可用日期,请确保它不是假期。出于某种原因,我想出的那个包括它正在循环的所有假期,所以它给了我一个截至今天的 12/21 的日期。当我寻找的最终结果是 12/04 时。有人能告诉我如何相应地调整吗?
http://jsfiddle.net/byyeh83t/9/
另外例如,如果今天是 10/12/2015 30 天后是 11/11/2015,这是退伍军人节,这个函数应该知道这一天是假期,然后将其设置为 11/12/2015 永远不允许它也将在周末。没有周末没有列出假期 http://jsfiddle.net/byyeh83t/13/
HTML
<input name="workExemptDays" id="workExemptDays" type="text"/>
JS
$(document).ready(function() {
//Testing purposes
var natDays = [
[2014, 1, 1, 'New Year'],
[2014, 1, 20, 'Martin Luther King'],
[2014, 2, 17, 'Washingtons Birthday'],
[2014, 5, 26, 'Memorial Day'],
[2014, 7, 4, 'Independence Day'],
[2014, 9, 1, 'Labour Day'],
[2014, 10, 13, 'Columbus Day'],
[2014, 11, 11, 'Veterans Day'],
[2014, 11, 27, 'Thanksgiving Day'],
[2014, 11, 28, 'Thanksgiving Day'],
[2014, 12, 25, 'Christmas'],
[2014, 12, 26, 'Christmas'],
[2015, 1, 1, 'New Year'],
[2015, 1, 19, 'Martin Luther King'],
[2015, 2, 16, 'Washingtons Birthday'],
[2015, 5, 25, 'Memorial Day'],
[2015, 7, 3, 'Independence Day'],
[2015, 9, 7, 'Labour Day'],
[2015, 10, 12, 'Columbus Day'],
[2015, 11, 11, 'Veterans Day'],
[2015, 11, 26, 'Thanksgiving Day'],
[2015, 11, 27, 'Thanksgiving Day'],
[2015, 12, 24, 'Christmas'],
[2015, 12, 25, 'Christmas']
];
// dateMin is the minimum delivery date
var dateMin = new Date();
function AddBusinessDays(curdate, weekDaysToAdd) {
var date = new Date(curdate.getTime());
while (weekDaysToAdd > 0) {
date.setDate(date.getDate() + 1);
//check if current day is business day
if (noWeekendsOrHolidays(date)[0]) {
weekDaysToAdd--;
}
}
return date;
}
function noWeekendsOrHolidays(date) {
var noWeekend = $.datepicker.noWeekends(date);
return (noWeekend[0] ? nationalDays(date) : noWeekend);
}
function nationalDays(date) {
for (i = 0; i < natDays.length; i++) {
if (date.getFullYear() == natDays[i][0] && date.getMonth() == natDays[i][1] - 1 && date.getDate() == natDays[i][2]) {
return [false, natDays[i][3] + '_day'];
}
}
return [true, ''];
}
function setDeliveryDate(date) {
$('#workExemptDays').val($.datepicker.formatDate('mm/dd/yy', date));
}
setDeliveryDate(AddBusinessDays(dateMin, 30));
});
基本上,如何显示从现在起 30 天后的日期,只有第 30 天才能检测它是周末还是假期,以确保它是有效的一天。
最佳答案
问题是您要检查从现在到接下来 30 天的每一天是周末还是假期。如果是周末或假期,您将删除一天。所以基本上你要增加 30 个工作日。
要获得 30 天后的第一个非周末或假期,您需要做的是从开始加上 30 天,然后从该日期开始检查并继续递增 1,直到找到不是周末或假期的一天。
将 AddBusinessDays
函数更改为如下所示:-
function AddBusinessDays(curdate, weekDaysToAdd) {
var date = new Date((new Date()).setDate(curdate.getDate() + weekDaysToAdd));
while (!noWeekendsOrHolidays(date)) {
date.setDate(date.getDate() + 1);
}
return date;
}
关于javascript - 显示从现在起 30 天后的日期,只有第 30 天检测是否是周末或假期是否正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33530154/