在<chrono>看来,没有Wednesday不小于Thursday。
Thursday - Wednesday 确实等于days{1}。但是Wednesday - Thursday 等于days{6},而不是days{-1}。
在现代文化中,有disagreement about which day is the first day of the week。 <chrono> 库认为我们不必就哪一天是一周的第一天达成一致。我们可以在没有这种约定的情况下对星期几进行有意义的计算。
为方便此类计算,<chrono> 将工作日视为一个独立的日历,每 7 天重复一次,在任何 7 天周期之间绝对没有区别。星期一在星期日之后,星期四在星期三之后,星期日在星期六之后。它是一个由七个值组成的循环范围,没有开始也没有结束。
实际上,就整数值而言,有两种流行的工作日编码:
- C 将 [Sunday, Saturday] 编码为 [0, 6]。
- ISO 将 [Monday, Sunday] 编码为 [1, 7]。
<chrono> 通过在 weekday 构造函数中接受 [0, 7] 来表示 Sunday、Monday、Tuesday、Wednesday、Thursday、Friday、Saturday ,Sunday,分别。并启用反向转换weekday有两个成员函数:
c_encoding()
iso_encoding()
根据这两个协议返回与存储的weekday 关联的整数值(0 或 7 表示周日,1 到 6 表示周一至周六)。
但是,对于涉及weekday 的计算,std::chrono::weekday 的底层编码应该被视为一个不重要的细节。
std::chrono::weekday 是一个包含 7 个值的循环范围。没有值大于任何其他值。它们要么相等,要么不相等。
任何两个weekday 值之间的差异(比如x 和y)导致days 的数量x 领先于y。这是真的,无论你想象什么数字编码代表 weekday 在引擎盖下。
这意味着Wednesday 不小于Thursday。 Wednesday 比 Thursday 早 6 天,Thursday 比 Wednesday 早 1 天。
这种设计可以在不依赖于底层编码的情况下进行诸如“从这个日期开始的下一个星期一”之类的计算:
std::chrono::sys_days
next_monday(std::chrono::sys_days x)
{
using namespace std::chrono;
return x + (Monday - weekday{x});
}
英文:
x 的工作日比星期一晚多少天?将那么多天添加到x。