2012-05-25 30 views
0

Boost中的boost :: gregorian :: from_ * string()解析函數似乎只處理4位數年(導致2位數年份的運行時錯誤)。如何使用boost :: gregorian解析C++中的2位數年?

什麼是使用boost :: gregorian :: from_ * string()函數來處理兩位數年份的最簡潔的方法?

一種可能性是對日期字符串進行一些預處理,並結合編程規則來添加2000或1900來消毒日期格式,但我不想重新發明輪子並添加太多的代碼,如果有的話一個更好的方法來做到這一點。

回答

0

看起來這種格式在boost中不受支持。幸運的是,解析日期格式是一個單線程。下面是一個用AX編寫的解析器,我相信你可以用Spirit編寫類似的代碼。

using namespace boost::gregorian; 
using namespace axe::shortcuts; 
unsigned year, month, day; 
auto date_rule = _uint >> year > '/' > _uint >> month > '/' > _uint >> day > _z; 
std::string date_string("99/01/22"); 
if(date_rule(date_string.begin(), date_string.end()).matched) 
{ 
    date d(year < 100 ? year + 1900 : year, month, day); 
    // etc. 
} 
+0

嘿,如果年份是2位數,年<100將始終爲真,但我明白了:-) – daj

0

Boost.DateTime不能做到這一點– the docs說,有你想要的行爲相匹配的%C格式標誌,但是它只能用於輸出,沒有輸入,而且當時只有一組有限的平臺。

相關問題