【问题标题】:Convert std::string to std::chrono::duration将 std::string 转换为 std::chrono::duration
【发布时间】:2020-11-17 06:57:48
【问题描述】:

我的目标是将"%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();

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

【问题讨论】:

    标签: c++ duration chrono


    【解决方案1】:

    您当前的解决方案有可能很少给您错误的答案。如果您的两个当地时间恰好跨越您当地时区的 UTC 偏移量变化(例如夏令时转变),那么该转变量将包含在减法中,随后给您错误的答案。

    我建议您自己进行解析以将小时、分钟和秒的值转换为ints:

    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。但是有一个 free, open-source preview of C++20 chrono 可以与 C++11/14/17 一起使用。这部分只需要header date.h,这是一个header-only库。

    #include "date/date.h"
    
    // ...
    
    seconds d;
    ss0 >> date::parse("%T", d);
    

    【讨论】:

    • 当然,流需要将其基数设置为 10(幸运的是,这是默认值),而不是 0/未设置,因为这些输入字符串经常包含前导零。
    • 同意。在我的回答中,sso 和 ss1 被假定具有与问题中相同的类型和值。
    • 感谢您的回答。我正在尝试将%H:%M:%S 形式的单个字符串转换为chrono::duration。有没有直接的方法来进行这种转换?
    • 我已经用一个免费的、开源的、仅包含标头的库更新了我的答案,该库将为您进行解析和添加。
    猜你喜欢
    • 2013-07-27
    • 1970-01-01
    • 2013-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-03
    • 2016-07-20
    • 1970-01-01
    相关资源
    最近更新 更多