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

时间:2015-07-29 21:48:12

标签: c++ datetime c++11 chrono

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

我想使用Howard Hinnant提议的date库来执行此转换。

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

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

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

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

1 个答案:

答案 0 :(得分:2)

通常,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,您可以继续使用duration

#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转换为std::chrono时,您完全位于time_point系统,可以使用durationcols <- names(survey) for(col in cols) { print(col) weights <- information.gain(DIGITAL~col, survey) print(weights) } 来执行您想要的任何操作。