将 std::string 转换为 std::chrono::duration

问题描述 投票:0回答:1

我的目标是将

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

它进行转换,但我想知道是否有一种优雅的方式或直接的方式来实现这一点。

c++ duration c++-chrono
1个回答
3
投票

您当前的解决方案可能很少会给您错误的答案。如果您的两个当地时间恰好跨越您当地时区的 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);
© www.soinside.com 2019 - 2024. All rights reserved.