C++ 如何在C++;20小时?

C++ 如何在C++;20小时?,c++,c++20,chrono,C++,C++20,Chrono,考虑到C++20中新增的功能,如何在日期中添加一些天数(比如n) 尝试此操作时,会出现编译时错误: auto d = July/4/2020; auto d2 = d + days{5}; ~ ^ ~~~~~~~ error: invalid operands to binary expression ('std::chrono::year_month_day' and 'std::chrono::days') 中的“日期”只是一个精确到天的时间点。和 “日期时间”只

考虑到C++20中新增的
功能,如何在日期中添加一些天数(比如
n

尝试此操作时,会出现编译时错误:

auto d = July/4/2020;
auto d2 = d + days{5};
          ~ ^ ~~~~~~~
error: invalid operands to binary expression
   ('std::chrono::year_month_day' and 'std::chrono::days')
中的“日期”只是一个精确到天的时间点。和 “日期时间”只是一个时间点(通常基于
系统时钟
),精度优于
。和中的规范“日期类型”
是:

chrono::time_point<chrono::system_clock, chrono::days>
因此,要将天数添加到
sys_days
中,只需执行以下操作:

sys_days tp = ...;
tp += days{n};
// or
auto tp2 = tp + days{n};
如果只是一天,您还可以:

++tp;
这是非常有效的,因为在引擎盖下,它只是增加了两个
int
s

如果您的
时间点
的精度小于
,则它仍然是 添加
天数的相同步骤:

auto tp = system_clock::now() + days{n};
尝试此操作时,会出现编译时错误:

auto d = July/4/2020;
auto d2 = d + days{5};
          ~ ^ ~~~~~~~
error: invalid operands to binary expression
   ('std::chrono::year_month_day' and 'std::chrono::days')
上述变量
d
的类型为
year\u month\u day
。尽管
year\u month\u day
在语义上等同于
sys\u days
, 它不直接支持
精度算法。
year\u month\u day
是一个精确的时间点(但不是一个
chrono::time\u point
)。相反,它是一个
{year,month,day}
数据 结构。您可以通过以下方式轻松执行天精度算术: 首先将其转换为系统天数:

auto d = July/4/2020;
auto d2 = sys_days{d} + days{5};
在这种情况下,结果
d2
的类型是
sys\u days
。如果你愿意的话 将结果设置为年、月、日,然后将其转换回:

year_month_day d2 = sys_days{d} + days{5};
此设计的基本原理:

效率。从
年\月\日
系统天数
的转换(以及 返回)需要一些数字运算。这不是一个很大的数目。但是 它比单个整数加法大

如果
库提供了
-年
月日的精度算法, 算法是将
年\月\日
转换为
系统\日
, 进行算术运算,然后将结果转换回
年\月\日
。如果您有大量的
天数
,请执行精确的算术运算 这样做,最好只在
sys\u天内进行通信,然后转换为
year\u month\u day
仅在必要时(即当您需要
字段)

如果库为
年\月\日
提供了日精度算法, 客户会盲目地使用它,没有意识到
year\u month\u day
是 应用程序的数据结构错误。这将类似于给予
std::list
索引操作符(这很容易做到):

您需要使用
,而不是
<代码>日期
是日历说明符 公历中的一个月的某一天<代码>天数是一个
chrono::duration
。请参见此了解更深入的信息 讨论这两个概念之间的区别

如果我有一个
year\u month\u day
,我想再加上几天 我知道这个月不到月底,我可以不用它吗 转换为系统天数从而获得效率

上面只需在
d
day
字段中添加5。没有 检查结果是否超过当月的最后一天。如果 它确实超过了一个月的最后一天,该结果将被存储 在day字段中(截止到第255天),和
d2.ok()
将返回
false


year\u month\u day
用于检索
year
month
day
日期中的字段。它也适用于
精密历法运算<代码>系统天数适用于
天数
精度算法,并用于转换为更高的精度 (日期和时间)

year\u month\u day
sys\u days
可以相互转换,而无需 信息丢失。使用最有意义的数据结构。 如果您忘记了,编译器会提醒您,就像它对
向量
(无
向前推
)、
列表
(无索引运算符),以及
forward\u list
(无
size
)。

好的,这是我第一次听说
chrono::operator/
。哇!我猜C++已经没有足够的嵌入式语言了…
year_month_day d2 = sys_days{d} + days{5};
template <class T, class A>
T&
list<T, A>::operator[](size_type i)
{
    return *advance(begin(), i);
}
auto d = July/4/2020;
auto d2 = sys_days{d} + day{5};
          ~~~~~~~~~~~ ^ ~~~~~~
error: invalid operands to binary expression
   ('std::chrono::sys_days' and 'std::chrono::day')
auto d = July/4/2020;
auto d2 = d.year()/d.month()/(d.day() + days{5});