2016-11-10 7 views
2

文字列形式でboost :: gregorian :: dateオブジェクトを作成しようとするコードがありますが、文字列が表示されていてもグレゴリオン:: not_a_date_time大丈夫です。私は私が返さnot_a_date_timeを得る文字列からブースト日付を作成する際に問題が発生する

boost::gregorian::date d = getDateFromString("20161101","%Y%m%d") ; 

を呼んでこれをテストするために

boost::gregorian::date getDateFromString(std::string date_str, std::string format) const 
    { 
     const std::locale loc = std::locale(std::locale::classic(), new boost::gregorian::date_facet(format.c_str())); 
     std::istringstream is(date_str) ; 
     is.imbue(loc); 
     boost::gregorian::date d; 
     is >> d; 
     return d; 
    } 

;: 私のコードは次のようになります 代わりに次のようにしてください:

boost::gregorian::date d2 = boost::gregorian::date_from_iso_string("20161101"); 

私は適切な日付オブジェクトを返します。 さまざまな日付形式を取ることができる汎用関数が必要です。私はここで間違って何をしていますか?

答えて

2

あなたはdate_facet代わりのdate_input_facetを使用している:

#include <boost/date_time.hpp> 
#include <boost/date_time/gregorian/gregorian_io.hpp> 

boost::gregorian::date getDateFromString(std::string date_str, std::string format) 
{ 
    const std::locale loc = std::locale(std::locale(), new boost::gregorian::date_input_facet(format.c_str())); 
    std::istringstream is(date_str); 
    is.imbue(loc); 
    boost::gregorian::date d; 
    is.exceptions(~std::ios::iostate::_S_goodbit); 
    is >> d; 
    return d; 
} 

int main() { 
    boost::gregorian::date d = getDateFromString("20161101","%Y%m%d"); 
    std::cout << d; 
} 

は、パーサが、それは解析に失敗した場合に間違っていると考えるものを見るためにexceptions()の使用に注意してください。例外を処理しない限り、おそらくそれを有効にしたくないでしょう。

Live On Coliru

プリント

2016-Nov-01 
関連する問題