给定年份、月份和日期,如何找到该日期或之后的下一个工作日?例如,如果我有 2025-04-28,如何找到 2025-04-28 之后的星期五,即 2025-05-02?
那么如何查找前一个工作日而不是下一个工作日呢?
我可以从价值观开始int
,将它们放入,chrono
然后int
再取回价值观吗?
如果输入日期已经在目标星期几,那么在获取输入日期和获取输入日期的一周之间需要进行什么更改?
给定年份、月份和日期,如何找到该日期或之后的下一个工作日?例如,如果我有 2025-04-28,如何找到 2025-04-28 之后的星期五,即 2025-05-02?
那么如何查找前一个工作日而不是下一个工作日呢?
我可以从价值观开始int
,将它们放入,chrono
然后int
再取回价值观吗?
如果输入日期已经在目标星期几,那么在获取输入日期和获取输入日期的一周之间需要进行什么更改?
要回答第一个问题,最好将其分解为几个部分:
我们将开始日期称为:
date
,将目标星期几称为:wd
。weekday
的date
。称之为starting_wd
。wd
确定提前的天数starting_wd
。称之为num_days
。num_days
date
这可能看起来像:
可以这样练习:
打印结果如下:
笔记:
weekday
的date
已经为wd
,则添加 0days
并返回date
。weekdays
被封装起来,因此您无需关心它。无论wd
和starting_wd
的值是多少, 始终在到 的num_days
范围内。您可以将 视为一个“循环范围”。days{0}
days{6}
weekdays
year_month_day
虽然正确,但操作效率低下。进行交易会sys_days
更有效率。为了解决最后一个问题,我们可以将返回类型和参数输入类型更改
date
为sys_days
:笔记:
year_month_day
是一种{y, m, d}
数据结构。sys_days
也是一种{count of days since epoch}
数据结构。 两者都表示日期。 并且两者之间的转换不会丢失信息。2025-05-02
。year_month_day
(表达式的类型April/28/2025
)到的隐式转换sys_days
。date
进行转换 。sys_days
num_days
year_month_day
,这些转换都会被隐式执行。因此,这些转换只会对需要它们的客户端产生成本(只需按实际使用量付费的设计原则)。现在很容易看出,消除本地临时变量并使其成为一行代码是微不足道的:
在这种情况下,您需要减去
days
date
前面的数量wd
:如果由以下因素驱动:
现在的输出是:
如果您有
year
、month
和day
整数,则如下所示:返回类型为
sys_days
,可隐式转换为year_month_day
。使用 getter:.year()
、.month()
和.day()
:在这种情况下,
y
有类型year
,m
有类型month
,d
有类型day
。如果您想要它为int
,只需显式转换为int
:month
并为此目的day
进行了明确的转换。unsigned
注意:这些显式转换与其他方式完全相反:从积分类型到计时类型:
这是一个对称的、易于记忆的 API。
注意: 为了让编译器能够检测到代码中的逻辑错误,最好不要转换为整型,而是保留在 chrono 类型系统中。这会将逻辑错误转化为编译时错误。但如果必须与其他日期库进行互操作,整数通常是唯一的方法。
这是一个非常简单的转换:只需增加
date
算法之前的(或在的情况下减少prev_weekday
):注意: LLVM 尚未实现增量运算符
time_point
(截至 2025 年 4 月)。您可以使用 来解决这个date += std::chrono::days{1};
问题。加分点:贴
constexpr
上去next_weekday
,它在编译时也能工作: