我创建了一个javascript递归函数来调整日期:如果日期是星期六或星期日或美国公众假期,那么日期将滚动到第二天,直到相关日期不是假日。我使用'moment.js'包和相关的'moment-holiday.js'文件。
代码如下:
<!doctype html>
<script src="moment.js"></script>
<script src="moment-holiday.js"></script>
<script>
function CalcDueDate(dueDate){
var dueDay = moment(dueDate).day();
console.log(dueDay);
if(dueDay == 0 || dueDay == 6 || IsUSHoliday(dueDate) !== undefined ){
dueDate = moment(dueDate).add(1, 'day').format();
console.log('a', dueDate);
CalcDueDate(dueDate);
}
console.log('b', dueDate);
return dueDate;
}
d = "2018-05-19"
var finalDue = CalcDueDate(d);
console.log(finalDue);
</script>
当我运行它时,结果是:
6 moment3.html:12
a 2018-05-20T00:00:00+07:00 moment3.html:9
0 moment3.html:12
a 2018-05-21T00:00:00+07:00 moment3.html:9
1 moment3.html:16
b 2018-05-21T00:00:00+07:00 moment3.html:16
b 2018-05-21T00:00:00+07:00 moment3.html:16
b 2018-05-20T00:00:00+07:00 moment3.html:23
2018-05-20T00:00:00+07:00
第一个'b'和'2018-05-21'的日期符合预期,但我不明白为什么第二个和第三个'b'出现了,并将日期带回'2018-05-20 ”。有人能告诉我我的代码在哪里做错了吗? 感谢。
答案 0 :(得分:0)
递归函数通常返回类似边缘情况的值或递归调用的值。您目前正在为两种情况返回一次。因此,您不仅得到额外的console.logs()
,而且您获得的错误的最终返回值为5/20/18,这是一个星期日。解决方法是确保您使用以下内容返回一个或另一个:
function CalcDueDate(dueDate){
var dueDay = moment(dueDate).day();
console.log(dueDay);
if(dueDay == 0 || dueDay == 6 || IsUSHoliday(dueDate) !== undefined ){
dueDate = moment(dueDate).add(1, 'day').format();
console.log('a', dueDate);
// return the result of recursion.
return CalcDueDate(dueDate);
}
else { // you actually don't need the else -- just here to make it clearer.
// OR return the edge case
console.log('b', dueDate);
return dueDate;
}
}