std::get_time 使用 %I 格式说明符在午夜或中午失败

std::get_time fails at midnight or noon using %I format specifier

当使用 std::get_time 时,我在午夜或中午解析 datetime 时出现异常。我使用 %I 格式说明符而不是 %H 因为小时应该在 1-12 之间。

Exception: "ios_base::failbit set: iostream stream error"

我使用的是 Microsoft Visual Studio 2013。

为什么在解析这个日期时间时会出现异常?我可以使用其他格式的掩码吗?

#include <iostream>
#include <iomanip>
#include <ctime>
#include <cstring>
#include <sstream>

int main()
{
    std::time_t time;
    std::string timeString = "1/5/15 12:00 AM";
    std::string formatMask = "%m/%d/%y %I:%M %p";

    std::tm tm;
    std::memset(&tm, 0, sizeof(std::tm));
    std::istringstream ss(timeString);
    ss.exceptions(std::ios::failbit | std::ios::badbit);

    try
    {
        ss >> std::get_time(&tm, formatMask.c_str());
        time = std::mktime(&tm);
    }
    catch (const std::exception& ex)
    {
        std::cout << ex.what() << std::endl;
    }

    std::cout << time << std::endl;
    return 0;
}

ios_base::failbit 通常表示在处理 istringstream 时发生了一些逻辑错误。检查 %I format 的描述似乎这里指定的范围是错误的,IMO 的 12 小时制应该是 range [00,11]

使用 Visual Studio 2013 编译器,它应该适用于 00:00 到 11:59。

感谢@Cubbi posix specification does specify the range to be range [01,12] but so does MSVS2013

time_get::do_get 的 MSDN 文档将范围指定为 range[00,11],这似乎是 std::get_time 在 VS2013 中使用的范围(@Cubbi 发现了这个)。