使用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中存储亚秒数据。如果你试图忽略它,你不能根据秒后的时间段来分割字符串吗? –