如何将 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
而不是 microseconds
或 nanoseconds
。
然后您可以添加 sys_days
和 duration
并将其分配给 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
s:
#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_point
s 和 duration
s 从那里做任何你想做的事。
我正在从外接实时时钟芯片获取 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
而不是 microseconds
或 nanoseconds
。
然后您可以添加 sys_days
和 duration
并将其分配给 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
s:
#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_point
s 和 duration
s 从那里做任何你想做的事。