2011-03-24 57 views
6

我试图使用boost :: date_time来解析日期字符串(从Twitter API获得)到一个ptime对象。日期格式的一个例子是:年已超出有效范围:1400 ... 10000

Thu Mar 24 16:12:42 +0000 2011 

不管我做什么,虽然,我得到一个“新年是超出有效范围的”异常试图解析字符串。日期格式相貌端正对我来说,这里是代码:

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”包含上述日期。我在格式字符串中犯了错误吗?

+1

有一件事是肯定的,你已经使用'函数调用中创建new'内存泄漏。你对Java或C#更有经验吗? – 2011-03-24 16:27:40

+0

是的,别担心我知道这一点,我刚刚重新安排了代码,试图让它工作,我会解决它,当我得到日期解析:)编辑:其实,我不认为它会导致泄漏... time_input_facet被refcounted,除非你传递1作为第二个可选的构造函数arg。 – Kazade 2011-03-24 16:37:00

+2

是的,我只是检查,传递一个指向堆栈上的time_input_facet的指针导致崩溃时语言环境被破坏(除非你传递1给构造函数禁用refcounting)。因此,上面的代码不会泄漏(即使它看起来应该:)) – Kazade 2011-03-24 16:54:54

回答

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'; 
} 
+0

谢谢,通常我会尝试与%H:%M:%S和+0000单独,但不是在同一时间!谢谢! – Kazade 2011-03-24 16:44:13

3

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

编辑:

%q也如下面的评论中指出的输出仅标志。

+0

即使我用%H替换%T:%M:%S,我也会得到相同的错误:(% – Kazade 2011-03-24 16:37:27

+0

@Kazade,'%q'也被称为“仅输出”的描述中,我怀疑这是真正的问题 – 2011-03-24 16:41:49

+0

是的,我只是想对'%q'发表评论,它没有'''好的小'!'使其立即明显:) – 2011-03-24 16:43:43