簡體   English   中英

將 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 偏移量變化(例如夏令時班次),那么該班次的量將包含在減法中,從而給您錯誤的答案。

我建議您自己進行解析以將小時、分鍾和秒的值轉換為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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM