如何更改现有std::chrono::system_clock::time_point的时间?
例如,假设我想实现这个函数:
void set_hour(std::chrono::system_clock::time_point& tp, int hour) {
// Do something here to set the hour
}
std::chrono::system_clock::time_point midnight_jan_1_2022{std::chrono::seconds{1640995200}};
set_hour(midnight_jan_1_2022, 11);
// midnight_jan_1_2022 is now 11am on Jan 1 2022
....发布于 2022-04-14 03:26:55
答案完全取决于你的意思。最简单的解释是,您希望获取tp所指向的任何日期(例如yyyy-mm-dd hh:MM:ss.fff...),并创建:yyyy-mm-dd hour:00:00.000...。
另一种可能的解释是,yyyy-mm-dd hh:MM:ss.fff...被转换为yyyy-mm-dd hour:MM:ss.fff...。
无论在哪种情况下,C++20都很容易做到这一点,而且如果您还没有访问C++20 <chrono>,那么就会有模仿C++20 <chrono>并与C++11/14/17一起工作的一个免费的、开放源代码的标头库。
如果您想对第一解释中描述的分钟、秒和次秒字段进行零化,即:
void
set_hour(std::chrono::system_clock::time_point& tp, int hour)
{
using namespace std::chrono;
auto day = floor<days>(tp);
tp = day + hours{hour};
}也就是说,您只需将time_point降到天精度,然后添加所需的小时数。
第二种解释稍微复杂一些:
void
set_hour(std::chrono::system_clock::time_point& tp, int hour)
{
using namespace std::chrono;
auto day = floor<days>(tp);
hh_mm_ss hms{tp - day};
tp = day + hours{hour} + hms.minutes() + hms.seconds() + hms.subseconds();
}在这里,您必须发现并恢复{分钟、秒、子秒}字段,以便将它们重新应用到所需的日期(以及所需的hour)。hh_mm_ss是一种C++20 {hours, minutes, seconds, subseconds}数据结构,它自动将持续时间转换为字段结构,这样您就可以更容易地替换小时字段。
这两种解决方案将为您的示例输入提供相同的答案:
2022-01-01 11:00:00.000000因为输入已经对分钟、秒和子秒字段进行了零化。
https://stackoverflow.com/questions/71866011
复制相似问题