将 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_clocksteady_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 偏移量变化(例如夏令时变化),那么该变化量将包含在减法中,随后会给您错误的答案。

我建议您自己进行解析,将小时、分钟和秒的值放入 ints:

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);