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

时间:2015-06-24 15:16:30

标签: c++11 visual-c++

使用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;
}

1 个答案:

答案 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找到了这个)。