我有两个文本字段。在第一个文本字段中,我使用jQueryUI Datepicker添加了一个日历。当用户从日期选择器中选择日期时,它应该自动添加30天到日期并在第二个文本字段中设置该值。我有这个工作要添加30天的日期。
但是,它应排除周末和假日,仅显示30个工作日。我该怎么做?
if ($('#cat option:selected').text() == "ABC") {
var date_billed = $('#datebilled').datepicker('getDate');
var date_overdue = new Date();
date_overdue.setDate(date_billed.getDate() + 30);
date_overdue = $.datepicker.formatDate('mm/dd/yy', date_overdue);
$('#datepd').val(date_overdue).prop('readonly', true);
}
更新:我添加了noWeekendsOrHolidays函数来禁用周末或假期。无论如何,我可以使用此功能来计算和添加工作日到该日期吗?
//holidays
var natDays = [
[7, 4, 'us']
];
function noWeekendsOrHolidays(date) {
var noWeekend = $.datepicker.noWeekends(date);
if (noWeekend[0]) {
return nationalDays(date);
} else {
return noWeekend;
}
}
function nationalDays(date) {
for (i = 0; i < natDays.length; i++) {
if (date.getMonth() == natDays[i][0] - 1 && date.getDate() == natDays[i][1]) {
return [false, natDays[i][2] + '_day'];
}
}
return [true, ''];
}
答案 0 :(得分:4)
解决了!这个答案here帮了大忙。
代码:
function AddBusinessDays(weekDaysToAdd) {
var curdate = new Date();
var realDaysToAdd = 0;
while (weekDaysToAdd > 0){
curdate.setDate(curdate.getDate()+1);
realDaysToAdd++;
//check if current day is business day
if (noWeekendsOrHolidays(curdate)[0]) {
weekDaysToAdd--;
}
}
return realDaysToAdd;
}
var date_billed = $('#datebilled').datepicker('getDate');
var date_overdue = new Date();
var weekDays = AddBusinessDays(30);
date_overdue.setDate(date_billed.getDate() + weekDays);
date_overdue = $.datepicker.formatDate('mm/dd/yy', date_overdue);
$('#datepd').val(date_overdue).prop('readonly', true);
答案 1 :(得分:2)
在处理假期时,实际上只有一种选择:一次一天。如果一天“计数”,您应该一次一天地迭代,并根据需要添加/减去。在伪代码中:
date add(date startDate, int daysToAdd) {
int i:=0
endDate:=startDate
while (i<daysToAdd) {
endDate++
if ( NOT(isWeekend(endDate))
AND NOT(isHoliday(endDate)) {
i++
}
}
return endDate
}
isWeekend()
实施起来微不足道;另一方面,isHoliday()
是一个非常难以破解的坚果。处理它的最简单方法是有一个已知假期表,并检查作为参数传递的日期是否与其中任何一个一致。在我看来,最好有一个基于规则的方法来计算给定日期是否是假日。
免责声明:我将之前的答案复制并粘贴到同一个问题中。见How to ignore weekends and holidays in boost date time?
答案 2 :(得分:2)
var numAdd = 30
var dataAvui = new Date()
for (var i=0;i<=numAdd;i++)
{
var dataTemp = dataAvui
console.dir(dataTemp.toString())
dataTemp.setDate(dataTemp.getDate() + 1)
if(dataTemp.getDay() == 6){
dataTemp.setDate(dataTemp.getDate() + 2)
}else if(dataTemp.getDay() == 0){
dataTemp.setDate(dataTemp.getDate() + 1)
}
dataAvui = dataTemp
}