我的目标是将
string
形式的单个"%H:%M:%S"
转换为chrono::duration
中的C++11
。
举个例子,为了转换
"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;
然后您可以非常简单地将它们转换为适当的单位并添加/减去它们:
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++20 chrono 的免费开源预览,它适用于 C++11/14/17。对于这部分,你只需要头文件 date.h,它是一个只有头文件的库。
#include "date/date.h"
// ...
seconds d;
ss0 >> date::parse("%T", d);