用单个数字解析C ++日期

时间:2017-06-06 13:20:42

标签: c++ date-parsing

我正在尝试解析包含每个月和每天的单个数字的日期。以下解析正确:

std::istringstream ss("2015/05/01");
std::tm tmb = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };

ss >> std::get_time(&tmb, "%Y/%m/%d");

但是当我尝试解析时

std::istringstream ss("2015/5/1");

我在流中遇到了一个失败的状态,并且没有正确地将时间读入结构中。有没有一种干净(高效)的方法可以解析它?

编辑:我正在开发Ubuntu 12.04和编译器g ++ 5.4.1。

2 个答案:

答案 0 :(得分:0)

您没有说明您所在的平台。

我建议不要编写自己的解析器。看一下strftime / strptime或Boost.Date_Time。

答案 1 :(得分:0)

您可以使用Howard Hinnant's portable, free, open-source date/time library。以下是该程序的外观:

#include "date.h"
#include <cassert>
#include <sstream>

int
main()
{
    date::year_month_day ymd;
    std::istringstream ss{"2015/5/1"};
    ss >> date::parse("%Y/%m/%d", ymd);
    assert(!ss.fail());
    using namespace date::literals;
    assert(ymd == may/1/2015);
}

如果您真的想要(here is how),可以将year_month_day转换为std:tm,但除非您需要与某些真正需要tm的客户进行通信,没有理由。

"date.h"仅限标题,因此易于安装,完整记录,易于使用,并且基于C ++ 11 <chrono>构建,因此它非常类型安全。

这是wandbox link showing it running the above program with gcc 5.4.0