代码之家  ›  专栏  ›  技术社区  ›  Klaus

STD:GETYTY时间没有解析日

  •  4
  • Klaus  · 技术社区  · 8 年前

    如果我试着在 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 回复  |  直到 8 年前
        1
  •  5
  •   Mike van Dyke    7 年前

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

    std::istringstream ss("02");

    编辑:现在我注意到 cppreference :

    将月份的第几天解析为十进制数(范围[01,31]), 前导零 允许但不要求 .

    也许是个虫子?

    Bug report here

        2
  •  1
  •   hellow Adolfo Casari    8 年前

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

    让我们看一下 %d 说明符位于 cppreference

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

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

    std::istringstream ss("02");
    

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