2011-03-24 58 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