将 std::string 转换为 std::chrono::duration
Convert std::string to std::chrono::duration
我的目标是将 "%H:%M:%S"
形式的单个 string
转换为 C++11
中的 chrono::duration
。
例如,为了转换"00:15:00"
,
我想出了以下间接解决方案,我计算了两个时间点 (1) "00:15:00"
和 (2) "00:00:00"
,它们与 system_clock
或 steady_clock
相关:我然后将它们相互减去以获得持续时间。
std::tm tm0 = {}, tm1{};
std::stringstream ss0("00:00:00"), ss1("00:15:00");
ss0 >> std::get_time(&tm0, "%H:%M:%S");
ss1 >> std::get_time(&tm1, "%H:%M:%S");
auto t0 = std::chrono::system_clock::from_time_t(std::mktime(&tm0));
auto t1 = std::chrono::system_clock::from_time_t(std::mktime(&tm1));
auto d = t1-t0;
std::cout << std::chrono::duration_cast<std::chrono::seconds>(d).count();
它进行转换,但我想知道是否有一种优雅的方式或直接的方式来实现这一点。
您当前的解决方案可能很少会给您错误的答案。如果您的两个当地时间恰好跨越您当地时区的 UTC 偏移量变化(例如夏令时变化),那么该变化量将包含在减法中,随后会给您错误的答案。
我建议您自己进行解析,将小时、分钟和秒的值放入 int
s:
int h0, h1;
int m0, m1;
int s0, s1;
然后您可以非常简单地将它们转换为正确的单位,然后 add/subtract 它们:
auto d = (hours{h1} + minutes{m1} + seconds{s1})
- (hours{h0} + minutes{m0} + seconds{s0});
d
的类型是seconds
。
在 C++11 中有多种解析选项,这里是最简单的选项之一:
ss0 >> h0 >> c >> m0 >> c >> s0;
ss1 >> h1 >> c >> m1 >> c >> s1;
(其中 c
是一个 char
来解析 :
)
在 C++20 中会有一个 std::chrono::parse
函数,可以这样使用:
seconds d;
ss0 >> parse("%H:%M:%S", d);
或者可以使用 "%T"
作为 "%H:%M:%S"
的快捷方式。我提到这个知道你使用的是 C++11,而不是 C++20。但是存在一个适用于 C++11/14/17 的 free, open-source preview of C++20 chrono。对于这部分,你只需要头文件 date.h,这是一个只有头文件的库。
#include "date/date.h"
// ...
seconds d;
ss0 >> date::parse("%T", d);
我的目标是将 "%H:%M:%S"
形式的单个 string
转换为 C++11
中的 chrono::duration
。
例如,为了转换"00:15:00"
,
我想出了以下间接解决方案,我计算了两个时间点 (1) "00:15:00"
和 (2) "00:00:00"
,它们与 system_clock
或 steady_clock
相关:我然后将它们相互减去以获得持续时间。
std::tm tm0 = {}, tm1{};
std::stringstream ss0("00:00:00"), ss1("00:15:00");
ss0 >> std::get_time(&tm0, "%H:%M:%S");
ss1 >> std::get_time(&tm1, "%H:%M:%S");
auto t0 = std::chrono::system_clock::from_time_t(std::mktime(&tm0));
auto t1 = std::chrono::system_clock::from_time_t(std::mktime(&tm1));
auto d = t1-t0;
std::cout << std::chrono::duration_cast<std::chrono::seconds>(d).count();
它进行转换,但我想知道是否有一种优雅的方式或直接的方式来实现这一点。
您当前的解决方案可能很少会给您错误的答案。如果您的两个当地时间恰好跨越您当地时区的 UTC 偏移量变化(例如夏令时变化),那么该变化量将包含在减法中,随后会给您错误的答案。
我建议您自己进行解析,将小时、分钟和秒的值放入 int
s:
int h0, h1;
int m0, m1;
int s0, s1;
然后您可以非常简单地将它们转换为正确的单位,然后 add/subtract 它们:
auto d = (hours{h1} + minutes{m1} + seconds{s1})
- (hours{h0} + minutes{m0} + seconds{s0});
d
的类型是seconds
。
在 C++11 中有多种解析选项,这里是最简单的选项之一:
ss0 >> h0 >> c >> m0 >> c >> s0;
ss1 >> h1 >> c >> m1 >> c >> s1;
(其中 c
是一个 char
来解析 :
)
在 C++20 中会有一个 std::chrono::parse
函数,可以这样使用:
seconds d;
ss0 >> parse("%H:%M:%S", d);
或者可以使用 "%T"
作为 "%H:%M:%S"
的快捷方式。我提到这个知道你使用的是 C++11,而不是 C++20。但是存在一个适用于 C++11/14/17 的 free, open-source preview of C++20 chrono。对于这部分,你只需要头文件 date.h,这是一个只有头文件的库。
#include "date/date.h"
// ...
seconds d;
ss0 >> date::parse("%T", d);