计算工作日的方法
Method to calculate business days
我有一个练习,我遇到了一点麻烦。
我必须创建一个计算器,它采用两个参数:开始日期和要添加的天数(周六和周日除外,只有工作日,从周一到周五)。另一件事是总和必须包括开始日期。
例如,让我们以 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
增加一两天。
日期库负责处理诸如days
和weeks
之间的关系以及如何向日期添加days
之类的事情。 它基于此处显示和描述的非常有效的(非迭代)算法。
如果不需要使用循环,则可能需要考虑使用更简单的计算来重构解决方案。 例如,考虑每五个工作日自动将日期增加七天。 因此,使用商数和要添加的天数的剩余天数应该告诉您在不诉诸暴力循环的情况下将总天数添加到date
由于这是一个练习,我不会详细介绍代码,但需要考虑的一些事情可能是如何弄清楚你在一周中的哪一天结束,知道你开始的那一天。 此外,如果您在星期五结束,紧随其后的周末会发生什么。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- C++从另一个类访问公共静态向量的正确方法是什么
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 没有为自己的结构调用列表推回方法
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在类定义之后定义一个私有方法
- 枚举环境变量的惯用C++14/C++17方法
- 计算工作日的方法