计算工作日的方法

Method to calculate business days

本文关键字:方法 工作日 计算      更新时间:2023-10-16

我有一个练习,我遇到了一点麻烦。

我必须创建一个计算器,它采用两个参数:开始日期和要添加的天数(周六和周日除外,只有工作日,从周一到周五)。另一件事是总和必须包括开始日期。

例如,让我们以 2016 年 7 月 12 日的开始日为例,并添加 8 天,对应于 2016 年 7 月 21 日(不包括星期六和星期日,2016 年 7 月 21 日星期二计为一天)。

我希望我清楚。

我试图编写一些代码,但它不起作用。

// rStringGridEd1->IntCells[3][row] is a custom stringgrid 
// and correspond to the number of days to add, j is the 
// counter for the loop
while (j < rStringGridEd1->IntCells[3][row]) 
{
    if (DayOfWeek(date) != 1 || DayOfWeek(date) !=7)
    {
        // if current date (TDate date = "12/07/16") is not Saturday or Sunday increment date by one day
        date++;
    }
    else if(DayOfWeek(date) == 1)
    {
        //If date correspond to sunday increment the date by one and j the counter by one
        date=date+1;
        j++;
    }
    else if(DayOfWeek(date) == 7)
    {
        //If date correspond to saturday increment the date by two days and j the counter by one
        date=date+2;
        j++;
    }
    j++;
}

请问谁能帮我?

以下是

Lee Painton的优秀(和投票)答案,使用这个免费的开源C++11/14日期库,该库建立在<chrono>之上:

#include "date.h"
#include <iostream>
date::year_month_day
get_end_job_date(date::year_month_day start, date::days length)
{
    using namespace date;
    --length;
    auto w = weeks{length / days{5}};
    length %= 5;
    auto end = sys_days{start} + w + length;
    auto wd = weekday{end};
    if (wd == sat)
        end += days{2};
    else if (wd == sun)
        end += days{1};
    return end;
}

你可以这样练习:

int
main()
{
    using namespace date::literals;
    std::cout << get_end_job_date(12_d/jul/2016, date::days{8}) << 'n';
}

哪些输出:

2016-07-21

这个简单的计算器有一个先决条件,即start不在周末。 如果这不是理想的先决条件,那么您可以在计算之前检测到它,并在内部将start增加一两天。

日期库负责处理诸如daysweeks之间的关系以及如何向日期添加days之类的事情。 它基于此处显示和描述的非常有效的(非迭代)算法。

如果不需要使用循环,则可能需要考虑使用更简单的计算来重构解决方案。 例如,考虑每五个工作日自动将日期增加七天。 因此,使用商数和要添加的天数的剩余天数应该告诉您在不诉诸暴力循环的情况下将总天数添加到date

变量中。

由于这是一个练习,我不会详细介绍代码,但需要考虑的一些事情可能是如何弄清楚你在一周中的哪一天结束,知道你开始的那一天。 此外,如果您在星期五结束,紧随其后的周末会发生什么。