C++用微秒解析日期/时间

Moh*_*ena 6 c++ datetime parsing posix

strptime用来解析具体格式的日期和时间.该格式使用Python格式化指令,它与C指令完全相同,只是%f在Python中有一个额外的指令,定义为毫秒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);
Run Code Online (Sandbox Code Playgroud)

这会导致解析错误,因为%f.我不能直接删除因为指令喜欢%m%d可以采取一个或两个数字.

此外,这是一个问题,因为该%f指令可能需要1到6位数.有办法解决这个问题吗?

我正在使用C++,如果有任何内置函数可以提供帮助.

How*_*ant 5

使用Howard Hinnant的免费,开放源代码,C ++ 11,仅标头的日期时间库,您可以轻松解析所需的任何精度。您只能将其放入,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);
}
Run Code Online (Sandbox Code Playgroud)

这使用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});
Run Code Online (Sandbox Code Playgroud)

如果您对<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
Run Code Online (Sandbox Code Playgroud)

如果位数超过所需的位数,解析将失败,但这仅是因为它看不到结尾(必填)Z

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

如果Z不是格式的一部分,它将被解析"2010-12-30T01:20:30.123"为milliseconds-precsion time_point

该库具有完整的解析和格式化功能,它们建立在std <chrono>库的顶部,因此您不必处理古老的tm结构。但是,如果需要,您可以tm与其他代码进行来回转换(精确到秒)。

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

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