std :: get_time没有解析一天

时间:2018-05-29 08:15:13

标签: c++ datetime

如果我尝试在tm中设置日std::get_time没有任何反应,但输入流处于失败状态,这意味着发生了解析错误。

以下代码有什么问题?

{   // setting time works
    std::tm t{};
    std::istringstream ss("01:02:03");
    ss.imbue(std::locale("de_DE"));
    ss >> std::get_time(&t, "%H:%M:%S");
    std::cout << ss.fail() << std::endl;
    std::cout << std::put_time(&t, "%c") << '\n';
}   

{   // setting day of month did not work
    std::tm t{};
    std::istringstream ss("2");
    ss.imbue(std::locale("de_DE"));
    ss >> std::get_time(&t, "%d");
    std::cout << ss.fail() << std::endl;
    std::cout << std::put_time(&t, "%c") << '\n';
} 

输出:

0 
Sun Jan  0 01:02:03 1900
1
Sun Jan  0 00:00:00 1900

2 个答案:

答案 0 :(得分:5)

你需要将前导零传递给当天:

std::istringstream ss("02");

编辑:现在我注意到根据cppreference

  

将月中的日期解析为十进制数(范围[01,31]),   前导零允许但不是必需的

也许这是一个错误?

编辑:Bug report here

答案 1 :(得分:1)

我不确定这一点,我怀疑,这是你的libstdc ++实现中的一个错误。

让我们看看cppreference

%d说明符的文档
  

将月中的日期解析为十进制数(范围[01,31]),允许但不是必需的前导零

您的代码失败了,但如果您这样做了:

std::istringstream ss("02");

它将perfectly compile。 当我在使用g ++ 5.4的本地机器上尝试时,它会产生相同的错误。你可以尝试使用更新的gcc / libstdc ++