C ++解析日期/时间,以微秒为单位

时间:2017-06-06 19:45:35

标签: c++ parsing datetime posix

我正在使用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 ++,如果有任何内置函数可以提供帮助。

1 个答案:

答案 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"的快捷方式。你可以使用。