2017-06-06 150 views
2

我正在使用strptime解析具有特定格式的日期和時間。該格式使用Python格式化指令,這些指令與C指令完全相同,只是在Python中有一個額外的%f指令,其毫秒數定義爲Microsecond as a decimal number, zero-padded on the left.。因此,例如:C++解析日期/時間(以微秒爲單位)

std::tm tmb; 
strptime("2010-12-30T01:20:30.0Z", "%Y-%m-%dT%H:%M:%S.%fZ", &tmb); 

這會導致因爲%f的解析錯誤。我不能直接刪除,因爲像%m%d這樣的指令可以採用一位或兩位數字。

此外,這是一個問題,因爲%f指令可能需要1到6位數字。有沒有辦法解決這個問題?

我在C++中工作,如果有任何可以幫助的內置函數。

+0

你想保留亞秒數據還是乾脆忽略它? https://stackoverflow.com/a/25155338/1364178表示你不能在tm中存儲亞秒數據。如果你試圖忽略它,你不能根據秒後的時間段來分割字符串嗎? –

回答

0

使用Howard Hinnant's free, open-source, C++11, header-only datetime library,你可以很容易地解析你想要的任何精度。你不能把它放到tm之內,因爲它被限制在秒精度。

例如:

#include "date.h" 
#include <cassert> 
#include <sstream> 

int 
main() 
{ 
    std::chrono::system_clock::time_point tp; 
    std::istringstream ss{"2010-12-30T01:20:30.123456Z"}; 
    ss >> date::parse("%FT%TZ", tp); 
    assert(!ss.fail()); 
    using namespace date; 
    using namespace std::chrono_literals; 
    assert(tp == sys_days(2010_y/dec/30) + 1h + 20min + 30s + 123456us); 
} 

這使用C++ 14個計時文字。如果您在C++ 11的時候,最後兩行是這樣:

using namespace std::chrono; 
    assert(tp == sys_days(2010_y/dec/30) + hours{1} + minutes{20} + 
              seconds{30} + microseconds{123456}); 

如果你堅持前<chrono> C++(C++ 98/C++ 03),該庫贏得幫不了你。

解析的精確度由輸入到parse函數中的time_point的精度來控制,而不是通過格式標記來控制。解析將嘗試解析爲的小數位數爲你time_point將舉行,但會優雅地放棄,如果它變得更少位數:

sys_time<nanoseconds> tp; // type-alias for a system_clock::time_point 
          // with nanoseconds precision 
ss >> date::parse("%FT%TZ", tp); // still ok 

如果有更多的數字比需要,解析會失敗,但僅僅是因爲它不會看到拖尾(必填)Z

sys_time<milliseconds> tp; 
ss >> date::parse("%FT%TZ", tp); 
assert(ss.fail()); // found "4" instead of "Z" 

如果Z一直沒格式的一部分,它會分析"2010-12-30T01:20:30.123"到毫秒,precsion time_point

此庫提供了完整的解析和格式化工具,建立在std <chrono> library之上,因此您永遠不必處理古代tm結構。但是,如果需要,您可以can convert to/from tm(以秒精度)與其他代碼進行通信。

"%F""%Y-%m-%d"的快捷方式。你也可以使用。

"%T""%H:%M:%S"的快捷方式。你也可以使用。

+1

謝謝! –