首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >替换chrono::time_point小时?

替换chrono::time_point小时?
EN

Stack Overflow用户
提问于 2022-04-14 03:00:09
回答 1查看 146关注 0票数 2

如何更改现有std::chrono::system_clock::time_point的时间?

例如,假设我想实现这个函数:

代码语言:javascript
复制
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
....
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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一起工作的一个免费的、开放源代码的标头库

如果您想对第一解释中描述的分钟、秒和次秒字段进行零化,即:

代码语言:javascript
复制
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降到天精度,然后添加所需的小时数。

第二种解释稍微复杂一些:

代码语言:javascript
复制
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}数据结构,它自动将持续时间转换为字段结构,这样您就可以更容易地替换小时字段。

这两种解决方案将为您的示例输入提供相同的答案:

代码语言:javascript
复制
2022-01-01 11:00:00.000000

因为输入已经对分钟、秒和子秒字段进行了零化。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71866011

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档