C++ 如何安全地记录您的工作日?

C++ 如何安全地记录您的工作日?,c++,c++20,chrono,C++,C++20,Chrono,我使用的是新的C++20日历/时区工具,这些工具在Clang/GCC中还不可用。我的问题同样适用于这两种实现:我如何安全地clock\u casttime\u points具有天持续时间 当我尝试时: 使用名称空间日期;//或者在C++20中使用std::chrono 太古时间太古{42}; sys_days sys=时钟(tai); 最后一条语句出现“无可行转换”错误。结果表明,结果使用的持续时间是common\u type,它来自转换中使用的utc\u clock::to\u sys()。

我使用的是新的C++20日历/时区工具,这些工具在Clang/GCC中还不可用。我的问题同样适用于这两种实现:我如何安全地
clock\u cast
time\u point
s具有
持续时间

当我尝试时:

使用名称空间日期;//或者在C++20中使用std::chrono
太古时间太古{42};
sys_days sys=时钟(tai);
最后一条语句出现“无可行转换”错误。结果表明,结果使用的持续时间是
common\u type
,它来自转换中使用的
utc\u clock::to\u sys()
。常见的持续时间类型是
std::chrono::seconds
,因此不能直接转换为
days
持续时间是正常的

如果我使用显式的
duration\u cast
,我可以编译它:

使用名称空间日期;//或者在C++20中使用std::chrono
太古时间太古{42};
自动浇铸=时钟浇铸(tai);
sys_days sys{std::chrono::duration_cast(casted.time_自_epoch())};
。。。但我担心由于截断(特别是对于纪元之前的日期),结果可能会减少一天。这是做我想做的事的正确方法吗?我应该使用
floor
而不是
duration\u cast


为什么在
utc\u clock::to\u sys()
中甚至有
std::common\u type\t
?它不应该简单地返回相同的持续时间类型吗?

时钟强制转换之所以坚持至少
精度,是因为
系统时钟
大钟
的历元之间的偏移具有
的精度:

auto diff = sys_days{} - clock_cast<system_clock>(tai_time<days>{});
cout << diff << " == " << duration<double, days::period>{diff} << '\n';
因此,
的精确投射是有损的。下面是另一种看待它的方式:

cout << clock_cast<tai_clock>(sys_days{2021_y/June/1}) << '\n';
即用历法术语

如果您只想知道日期,我建议
round(result)


可以想象,在一个方向上使用
floor
,在另一个方向上使用
ceil
,但这很容易出错<代码>循环就可以了,因为整数天数的偏移量目前只有37秒,而且增长非常缓慢。

很少有地方可以让库作者回答您的问题。。。。作者在这方面非常慷慨,我们都从中受益。我非常感谢这个答案,以及你在这个非常有用的图书馆所做的工作。荣耀归于你和你的家!你一直是我约会库的顾客。我很感激。:-)
cout << clock_cast<tai_clock>(sys_days{2021_y/June/1}) << '\n';
2021-06-01 00:00:37
cout << round<days>(clock_cast<tai_clock>(sys_days{2021_y/June/1})) << '\n';
2021-06-01 00:00:00