如何将 YYYY/MM/DD HH:MM:SS 转换为 std::chrono::system_clock::time_point?

How do I convert YYYY/MM/DD HH:MM:SS to std::chrono::system_clock::time_point?

我正在从外接实时时钟芯片获取 YYYY/MM/DD HH:MM:SS 组件。我想将其转换为 std::chrono::system_clock::timepoint 以便我可以获得自纪元以来的秒数并更新操作系统的时间。

我想使用 Howard Hinnant's proposed date 库来执行此转换。

我会直觉地做这样的事情:

date::year_month_day ymd = ...;
date::time_of_day tod = ...;
auto sysTime = date + tod;

但我没有看到合适的 operator+ 重载。我错过了什么吗?

此类转换的另一个用例是将日历日期和时间转换为 std::chrono::timepoint,我可以将其传递给 boost::asio::steady_timer

通常 time_of_day 仅用于将持续时间格式化为 hh:mm:ss.fff 以供输出。但是可以将 time_of_day 变回 std::chrono::duration:

auto tod = make_time(hours{17} + minutes{16} + seconds{45});  // time_of_day
auto d = seconds(tod);                                        // seconds

在 C++14 中,我会使用更简洁的代码:17h + 16min + 45s,但正如您提到的,您使用的是 C++11,我将坚持使用 C++11 代码。

一个 year_month_day 可以转换成一个 sys_days 用:

auto ymd = jul/29/2015;
auto dp = sys_days{ymd};

sys_days 只不过是 system_clock::time_point,但分辨率为 days 而不是 microsecondsnanoseconds

然后您可以添加 sys_daysduration 并将其分配给 system_clock::time_point。把它们放在一起:

#include "date.h"
#include <iostream>

int
main()
{
   using namespace date;
   using namespace std::chrono;
   auto ymd = jul/29/2015;
   auto tod = make_time(hours{17} + minutes{16} + seconds{45});
   system_clock::time_point tp =  sys_days(ymd) + seconds(tod);
}

在这个简化的示例中,无需通过 time_of_day,您可以继续使用 durations:

#include "date.h"
#include <iostream>

int
main()
{
   using namespace date;
   using namespace std::chrono;
   auto ymd = jul/29/2015;
   system_clock::time_point tp = sys_days(ymd)
                               + hours{17} + minutes{16} + seconds{45};
}

要记住的主要事情是 sys_days 只是一个粗略的 system_clock::time_point,当您从 year_month_day 转换为它时,您就完全处于 [=34] =] 系统,可以用 time_points 和 durations 从那里做任何你想做的事。