C++ std::get_时间未分析日期

C++ std::get_时间未分析日期,c++,datetime,C++,Datetime,如果我尝试使用std::get_time在tm中设置日期,则不会发生任何事情,但输入流处于失败状态,这意味着发生了解析错误 以下代码有什么问题 { // 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::

如果我尝试使用
std::get_time
tm
中设置日期,则不会发生任何事情,但输入流处于失败状态,这意味着发生了解析错误

以下代码有什么问题

{   // 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';
} 

您需要将前导零传递到当天:

std::istringstream ss(“02”)

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

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

也许是虫子


编辑:

对此我不是很确定,我怀疑这是libstdc++实现中的一个bug

让我们看一下位于的
%d
说明符的文档

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

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

std::istringstream ss("02");
会的。
当我使用g++5.4在本地机器上尝试时,它将产生相同的错误。你可以用一个更新的gcc/libstdc++

may试试,你可以试试这个std::istringstream ss(“2011-2-18”);而不是“2”@TheRealLife:为什么我应该添加一年和一个月?是否设置日期?使用
clang
(libc++)可以很好地工作。@Holt:在我的文本框中,clang版本5.0.2不适用。也许在fedora上,clang也使用gcc的libg++?但是,在clang中,我不能使用std::visit,因为有一个错误:-)您必须显式地启用libc++
-stdlib=libc++
“您可以用一个较新的gcc/libstdc++”抱歉,没有较新的:-)它将在std::visit中失败,因此更容易使用前导零。没有什么是完美的!:-)@克劳斯刚刚找到了bug报告:它来自2010年!哇!c++11还引入了许多其他未解决的问题,这些问题永远不会得到解决:-(感谢您的研究+1@Klaus是的…但是错误报告是去年更新的,所以也许你很幸运:D
std::istringstream ss("02");