C ++ 11日期/时间与小数秒

时间:2017-10-24 03:21:37

标签: c++ c++11 datetime

有人知道一种快速,便携的方法来解析包含小数秒的日期/时间字符串吗?

例如:

2017-10-23T07:23:08.78

到目前为止,我可以用以下方法解析其他所有内容:

std::tm tm = {};
std::stringstream datestr("2017-10-23T07:23:08.78");
datestr >> std::get_time(&tm, "%Y-%m-dT%H:%M:%S.??");

上述代码段已从this帖子修改。

This其他帖子显示了解析年度两次的聪明伎俩。不幸的是,由于小数秒是我表示中的最后一个字段,它将覆盖我实际想要使用的任何有效字段。

参考文档(here)没有列出小数秒的任何转换说明符,也没有列出任何可用于匹配和丢弃任意数字的说明符(与%t或{{1相同)对于空白。

要清楚,我完全可以放弃这部分精度。我宁愿不使用原始字符串函数来操作它,但这似乎是我能找到的唯一选择。

最后,此字符串来自远程服务器,因此格式不受我的控制。我的环境目前是Posix,虽然我希望尽可能多的便携性。

修改:此问题已被标记为this的副本。我不相信这是因为我的问题是关于解析/丢弃没有字符说明符的令牌。这在其他帖子中是独一无二的,例如,使用%n来解析时区(我也不感兴趣)。我的问题专门针对解析,而不是对结果值的解释。

1 个答案:

答案 0 :(得分:2)

根据上面inxoy的精彩评论,以下是Howard Hinnant's, free, open-source, portable, datetime library的方法:

#include "date/date.h"
#include <iostream>
#include <sstream>

int
main()
{
    std::stringstream datestr("2017-10-23T07:23:08.78");
    date::sys_time<std::chrono::milliseconds> tp;
    datestr >> date::parse("%FT%T", tp);
    if (datestr.fail())
        return 1;
    std::cout << date::format("%F %T\n", tp);
}

date::sys_time<std::chrono::milliseconds>std::chrono::system_clock::time_point的类型别名,除了milliseconds精度(您可以使用任何所需的精度)。

"%F""%Y-%m-%d"的捷径,您可以互换使用。

如果您想要std::tmwiki page shows how to do this以及大量其他示例代码。

上述程序可以输出:

2017-10-23 07:23:08.780

我可以改为使用:

std::chrono::system_clock::time_point tp;

这会将我的输出更改为:

2017-10-23 07:23:08.780000

%T格式化程序将输出time_point具有的精度,%T解析器将解析与time_point一样多的十进制数字。

"date/date.h"没有时区。它是严格的UTC(技术上Unix Time)。如果您需要使用时区(或闰秒),则可以在"date/date.h"之上构建一个额外的free, open-source IANA time zone library