【问题标题】:C++ date parsing with single digitsC++ 日期解析与个位数
【发布时间】:2017-06-06 13:20:42
【问题描述】:

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

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 上开发。

【问题讨论】:

标签: c++ date-parsing


【解决方案1】:

你没有说你在哪个平台上。

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

【讨论】:

  • 我正在使用 c++11 标准的 Ubuntu 12.04 机器上进行开发。
【解决方案2】:

您可以使用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 &lt;chrono&gt; 构建,因此非常安全。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-22
    • 1970-01-01
    相关资源
    最近更新 更多