使用std::get_time
时,在午夜或中午解析datetime
时会出现异常。我使用%I
格式说明符而不是%H
,因为小时应该在1-12之间。
异常:“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;
}
答案 0 :(得分:2)
ios_base::failbit
通常意味着在处理istringstream
时出现了一些逻辑错误。检查%I format的描述似乎这个范围似乎错误地指定了,对于12小时时钟IMO应该是range [00,11]
。
理想情况下,它应该在Visual Studio 2013编译器的00:00到11:59之间工作。
感谢@Cubbi posix specification指定的范围为range [01,12]
,MSVS2013也是如此。
time_get::do_get的MSDN文档指定的范围为range[00,11]
,这似乎是std::get_time
在VS2013中使用的内容(@Cubbi找到了这个)。