我正在使用strptime
以特定格式解析日期和时间。该格式使用Python格式化指令,它与C指令完全相同,只是在Python中有一个额外的%f
指令,定义为Microsecond as a decimal number, zero-padded on the left.
毫秒。例如:
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 :(得分:3)
使用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 chrono文字。如果你在C ++ 11中,最后两行看起来像:
using namespace std::chrono;
assert(tp == sys_days(2010_y/dec/30) + hours{1} + minutes{20} +
seconds{30} + microseconds{123456});
如果你坚持使用pre <chrono>
C ++(C ++ 98 / C ++ 03),那么这个库对你没用。
解析的精度由您输入time_point
函数的parse
的精度控制,而不是由格式化标志控制。解析将尝试解析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"
解析为毫秒级 - time_point
。
此库具有完整的解析和格式设置,构建于std <chrono>
library之上,因此您永远不必处理古老的tm
结构。但是如果需要的话,你可以can convert to/from tm
(精确到秒)与其他代码进行通信。
"%F"
是"%Y-%m-%d"
的快捷方式。你可以使用。
"%T"
是"%H:%M:%S"
的快捷方式。你可以使用。