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 发现了这个)。
当使用 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 发现了这个)。