如果我尝试在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
答案 0 :(得分:5)
你需要将前导零传递给当天:
std::istringstream ss("02");
编辑:现在我注意到根据cppreference:
将月中的日期解析为十进制数(范围[01,31]), 前导零允许但不是必需的。
也许这是一个错误?
答案 1 :(得分:1)
我不确定这一点,我怀疑,这是你的libstdc ++实现中的一个错误。
让我们看看cppreference
上%d
说明符的文档
将月中的日期解析为十进制数(范围[01,31]),允许但不是必需的前导零
您的代码失败了,但如果您这样做了:
std::istringstream ss("02");
它将perfectly compile。 当我在使用g ++ 5.4的本地机器上尝试时,它会产生相同的错误。你可以尝试使用更新的gcc / libstdc ++