C++11 std::get_时间在午夜或中午使用%I格式说明符失败

C++11 std::get_时间在午夜或中午使用%I格式说明符失败,c++11,visual-c++,C++11,Visual C++,使用std::get_time时,在午夜或中午解析datetime时会出现异常。我使用的是%I格式说明符,而不是%H,因为小时应该在1-12之间 异常:“ios_base::failbit集:iostream流错误” 我正在使用Microsoft Visual Studio 2013 为什么在解析此日期时间时出现异常?我可以使用不同格式的掩码吗 #include <iostream> #include <iomanip> #include <ctime> #i

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

异常:“ios_base::failbit集:iostream流错误”

我正在使用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;
}
#包括
#包括
#包括
#包括
#包括
int main()
{
标准:时间;
std::string timeString=“1/5/15 12:00 AM”;
std::string formatMask=“%m/%d/%y%I:%m%p”;
std::tm;
std::memset(&tm,0,sizeof(std::tm));
std::istringstream ss(时间串);
ss.异常(std::ios::failbit | std::ios::badbit);
尝试
{
ss>>std::get_time(&tm,formatMask.c_str());
时间=标准时间::mktime(&tm);
}
捕获(const std::exception&ex)
{

std::cout
ios_base::failbit
通常意味着在处理
istringstream
时发生了一些逻辑错误。检查说明似乎此处的范围指定错误,对于12小时的IMO,它应该是
范围[00,11]

在Visual Studio 2013编译器中,它最好在00:00到11:59之间工作

幸亏@Cubbi确实指定了范围为
range[01,12]
,但是它也指定了范围


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

例外情况是否是一个秘密?问题:您是否有理由认为
memset
归零
std::tm
是一个有效值?看,这意味着您说这是1900年1月0日午夜,即一年中的第一天,DST无效。这不仅不一致,还包括至少一个无效值“超出范围”(一个月的第0天)。使用
std::tm
memset可能会有其他副作用(我不记得它是否保证是可复制的标准布局结构)。获取
localtime
,然后将h/m/s设置为零,至少是一种行为。@Yakk tm参数是get_time的输出,而不是输入。对不起,我的错误,添加了exception@JordanBean您试图用什么语言环境来解析它?对%I的描述是“将小时解析为十进制数字,12小时时钟(范围[01,12]),允许前导零,但不是必需的"确切地说,我认为这个规范是不正确的。我的范围是00,11。12小时的时钟从0点开始,在11:59HMM,结束,你可能是正确的,我尝试使用0:00代替,并且WorkDethe规范实际上是01-12,在POSIX中,C++标准是指这个。将其命名为0-11。难怪除了VisualStudio之外,操作代码在任何地方都能按预期工作