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::coutios_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之外,操作代码在任何地方都能按预期工作