【问题标题】:Calculate working days from a original date从原始日期计算工作日
【发布时间】:2019-03-12 07:13:14
【问题描述】:

我们需要什么:

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

我们也可以让它只显示日期而不是(时间和greenwhich)在日期结束时

到目前为止,我有一个简单的 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;

【问题讨论】:

  • 每个月不一定有28个工作日...所以一个月末加上28个工作日并不一定就是第二个月的最后一个工作日。
  • @terry 我知道,这很好,但我需要能够获得第 1 个月的结束日期并添加 1 天,然后计算日期(从该日期起 28 个工作日)和将其显示为第 2 个月结束.. 等等 12 个月的预测
  • 你知道最终会与月份不同步,对吧? “结束日期”是指最后一个工作日吗?最后一个日历日?
  • 工作日是周一到周五。没有一个月你有 28 天。我认为您需要更详细地描述您的要求,或者提供某种图形/图表/示例来向我们展示您的实际需求。
  • 太好了:现在将这些信息放在您的问题中,以便其他人可以实际看到它,而无需通过 cmets 线程。

标签: javascript


【解决方案1】:

您可以这样做。请注意,要获得 28 个工作日的“月”的最后一天,您需要将 27 个工作日添加到第一天(而不是 28)。加上 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>

【讨论】:

  • 这个问题已经回答here
  • 我们可以防止太阳和星期六吗?例如我可以输入 2019 年 1 月的星期日...我们不想要星期六和星期日
  • 我刚刚纠正的公式中有一点错误。当您输入周六或周日时,表格将从下周一开始。
  • 抱歉,您能否删除/排除这些日期 2019 年 4 月 19 日 2019 年 4 月 22 日 2019 年 5 月 6 日 2019 年 5 月 27 日 2019 年 8 月 26 日 2019 年 12 月 25 日 2019 年 12 月 26 日
  • 你自己尝试过吗?你遇到什么问题?尝试将这些特殊的日子放在一个数组中,并在嵌套的workingDay 函数中测试它们。如果你不能让它工作,不要犹豫,提出一个新问题。
【解决方案2】:

由于可以通过将日期签名为变量来将此日期转换为毫秒,因此您只需在 ms 中添加一天,这样您就会得到“4 月 19 日”,或者试试这个endDate.setDate(endDate.getDate() + 1) - 我认为也可以.

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

希望我能帮上忙。

【讨论】:

    猜你喜欢
    • 2022-12-11
    • 2015-08-01
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2023-01-12
    • 1970-01-01
    相关资源
    最近更新 更多