【发布时间】:2020-06-22 01:54:04
【问题描述】:
我想创建一个计算截止日期的东西,知道开始日期和所需天数。例如,我在 7 月 6 日开始一些项目,我认为我需要 12 天才能完成它,所以我的算法的结果将是 7 月 21 日,因为我在周六和周日休息。
我的问题是我也在一些特殊的日子里休息,比如 7 月 14 日(我住在法国,7 月 14 日是休息日)。
这是我当前的脚本:
function generateEndDate(fromDate,total_days) {
let startDate = new Date(fromDate);
let endDate = new Date(fromDate);
let tmpDate = new Date(fromDate); //a bit redundant I know
endDate.setDate(endDate.getDate()+total_days);
let daysOff = 0;
let extraDaysOff = 0;
for(let i = 0; i<=total_days; i++){
tmpDate.setDate(tmpDate.getDate() + 1)
if(tmpDate.getDay() === 6 || tmpDate.getDay() === 0 || joursFeriesAnnee.includes(tmpDate.toISOString().slice(0, 10))){
daysOff++;
}
}
endDate.setDate(startDate.getDate() + total_days + daysOff)
if(endDate.getDay() != 6 || endDate.getDay() != 0 || joursFeriesAnnee.includes(endDate.toISOString().slice(0, 10))){
if(endDate.getDay() === 6){
extraDaysOff += 2;
}else if(endDate.getDay() === 0 || joursFeriesAnnee.includes(endDate.toISOString().slice(0, 10))){
extraDaysOff +=1;
}
}
console.log(daysOff);
console.log(extraDaysOff);
console.log(endDate.toISOString().slice(0, 10));
endDate.setDate(endDate.getDate() + daysOff + extraDaysOff)
$(date_fin_input).val(endDate.toISOString().slice(0, 10))
}
joursFeriesAnnee 是一个数组,在法国今年每天休息,
如果截止日期是在周末或休息日,那么我会跳到下一个星期一/天(如果最后一天是星期五,但它也在 joursFeriesAnnee 或者星期一在 joursFeriesAnnee,我的算法会有问题。但是对于现在我没有遇到这种情况。
i/o 示例:
fromDate = 15/06/2020
total days = 23
my output = 19/08/2020
expected output = 17/07/2020 (4 weekends + 14th of July = 9 days off)
and my console.logs outputs:
6
0
2020-08-19
我该如何处理?
澄清
如果我需要 1 天,截止日期应与开始日期相同
如果开始日是星期五,那么星期五 + 1 是星期一
如果开始日是周四,周五是节假日,那么周四 + 1 是周一
如果在 250 天之类的某个时间段内,周末 + 假期的数量返回如下:startingDay +(周末 + 假期)= 周六、周日或圣日,那么我需要通过添加本周末或假期将我的截止日期调整为下一周或下一天在我的休息日数中。
【问题讨论】:
-
我不太明白你想要什么,但我认为应该如下。你想知道几天后它会落在什么日期,不管周六和周日吗?例如,今天是 2020 年 6 月 11 日,您想知道 10 天内您一周中有多少天,即跳过周六和周日,即 2020 年 6 月 25 日
-
会是这个吗?
-
除了周六和周日还有假期
-
好的,我知道了。我现在的问题与参数有关。第一个参数是日期,第二个参数是天数还是第二个日期?
-
您需要明确添加天数的规则,包括开始天数和结束天数。星期五 + 1 是星期一吗?如果是这样,那么星期六 + 1 也是星期一(暂时忽略公共假期)?
标签: javascript date