使用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"
的快捷方式。你也可以使用。
你想保留亞秒數據還是乾脆忽略它? https://stackoverflow.com/a/25155338/1364178表示你不能在tm中存儲亞秒數據。如果你試圖忽略它,你不能根據秒後的時間段來分割字符串嗎? –