计算原始日期的工作日

时间:2019-03-11 20:53:52

标签: javascript

我们需要什么:

示例客户的开始日期是2019年3月11日-28个工作日等于4月18日,4月18日成为第1个月的结束日期,第2个月的开始日期是4月18日(第1个月的结束日期+ 1),等于19日4月,然后第2个月的结束日期是+28个工作日,以此类推,在接下来的12个月中,我们需要结束日期和开始日期。

我们也可以使用它,以便仅显示日期而不是在日期结束时显示(时间和绿色)

到目前为止,我有一个可以工作的简单js 28个工作日脚本...但是我不知道该怎么做,我尝试用html抓取元素并重新执行脚本,但是没有按计划工作。

愿有人帮助解决这一难题。非常感谢。

var startDate = "2019-03-11";
startDate = new Date(startDate.replace(/-/g, "/"));
var endDate = "", noOfDaysToAdd = 28, count = 0;
while(count < noOfDaysToAdd){
    endDate = new Date(startDate.setDate(startDate.getDate() + 1));
    if(endDate.getDay() != 0 && endDate.getDay() != 6){
       count++;
    }
}

document.getElementById("month1end").value = endDate;

2 个答案:

答案 0 :(得分:1)

这是您的方法。请注意,要获得28个工作日的“月”的最后一天,您需要在第一天(而不是28)增加27个工作日。加28将给您下个月的第一天。

我建议使用将给定日期(对象)增加多个工作日的函数。这将确保结果是一个工作日。因此,即使您添加0天,它也可能会更改日期(当它是周末时)。

这里是函数,以及生成12个月的附加代码,还支持银行假期。只需在第一个任务中定义它们:

const bankHolidays = new Set([
    Date.parse("April, 19 2019"), 
    Date.parse("April, 22 2019")
]);
function addWorkingDays(date, days) {
    function workingDay(date) {
        while (true) {
            let day = (date.getDay() + 1) % 7;
            if (day < 2) date.setDate(date.getDate() + 2 - day);
            if (!bankHolidays.has(date.getTime())) break; 
            date.setDate(date.getDate()+1);
        }
    }
    workingDay(date);
    while(days--) {
        date.setDate(date.getDate() + 1);
        workingDay(date);
    }
    return date;
}

document.querySelector("button").addEventListener("click", function() {
    const dateStr = document.querySelector("#startdate").value.replace(/-/g, "/");
    const date = new Date(dateStr);
    addWorkingDays(date, 0); // Make sure it is a working day
    const td = document.querySelectorAll("td");
    for (let i = 0; i < 12; i++) {
        td[i*2].textContent = date.toDateString();
        td[i*2+1].textContent = addWorkingDays(date, 27).toDateString();
        addWorkingDays(date, 1);
    }
});
table, tr, td, th {
  border: 1px solid;
  border-collapse: collapse;
}
<label>Start date: <input id="startdate"></label>
<button>Generate months</button>

<table>
    <tr><th>start</th><th>end</th></tr>
    <tr><td></td><td></td></tr>
    <tr><td></td><td></td></tr>
    <tr><td></td><td></td></tr>
    <tr><td></td><td></td></tr>
    <tr><td></td><td></td></tr>
    <tr><td></td><td></td></tr>
    <tr><td></td><td></td></tr>
    <tr><td></td><td></td></tr>
    <tr><td></td><td></td></tr>
    <tr><td></td><td></td></tr>
    <tr><td></td><td></td></tr>
    <tr><td></td><td></td></tr>
</table>

答案 1 :(得分:0)

由于该日期可以通过将其签名为变量而转换为毫安,因此您只需以毫秒为单位添加一天,就可以得到“ 4月19日”,或尝试使用endDate.setDate(endDate.getDate() + 1)-也可以使用我认为。

如果要在12个月内自动执行此操作,只需将代码放入循环中,并在每次迭代后更改开始日期即可。

希望我能帮上忙。