年份超出有效范围:1400 ... 10000

时间:2011-03-24 16:22:59

标签: c++ parsing boost datetime

我正在尝试使用boost :: date_time将日期字符串(从Twitter API获取)解析为ptime对象。日期格式的一个示例是:

Thu Mar 24 16:12:42 +0000 2011

无论我做什么,但在尝试解析字符串时,我得到“Year is out of valid range”异常。日期格式对我来说是正确的,这是代码:

boost::posix_time::ptime created_time;
std::stringstream ss(created_string);
ss.exceptions(std::ios_base::failbit); //Turn on exceptions
ss.imbue(std::locale(ss.getloc(), new boost::posix_time::time_input_facet("%a %b %d %T %q %Y")));
ss >> created_time;

在上面的代码中,“created_string”包含上述日期。我在格式字符串中犯了错误吗?

2 个答案:

答案 0 :(得分:4)

%T%q都是输出在线格式标记。

为了证明这一点,请将格式更改为"%a %b %d %H:%M:%S +0000 %Y",程序将按照说明运行。

对于时区输入,它有点复杂,您可能需要预先处理字符串以首先将+0000更改为posix time zone format

编辑:例如你可以这样做:

#include <iostream>
#include <sstream>
#include <boost/date_time.hpp>
int main()
{
        //std::string created_string = "Thu Mar 24 16:12:42 +0000 2011";
        // write your own function to search and replace +0000 with GMT+00:00
        std::string created_string = "Thu Mar 24 16:12:42 GMT+00:00 2011";

        boost::local_time::local_date_time created_time(boost::local_time::not_a_date_time);
        std::stringstream ss(created_string);
        ss.exceptions(std::ios_base::failbit);
        ss.imbue(std::locale(ss.getloc(),
                 new boost::local_time::local_time_input_facet("%a %b %d %H:%M:%S %ZP %Y")));
        ss >> created_time;
        std::cout << created_time << '\n';
}

答案 1 :(得分:3)

根据docs%T目前无法用于输入,因为其后跟图表中的!。我现在无法测试它,但我怀疑这是你的问题。

编辑:

%q也是一个仅输出标志,如下面的评论所述。