2011-06-30 4 views
2

文字列からptimeに変換する際に時間の割合を読み取る際に問題があります。ここで はに関するsoruceコードです:文字列をptimeに変換するときにptime input_facetエラーが%fフラグで返される

#include <iostream> 
#include <string> 
#include <boost/date_time.hpp> 
#include <boost/date_time/posix_time/posix_time.hpp> 
#include <boost/date_time/gregorian/gregorian.hpp> 
#include <boost/date_time/posix_time/conversion.hpp> 

int main(int, char *) 
{ 
    using namespace std; 
    using namespace boost; 
    using namespace boost::posix_time; 
    using namespace boost::local_time; 
    using namespace boost::gregorian; 

    time_facet*  output_facet = new time_facet(); 
    time_input_facet* input_facet = new time_input_facet(); 

    stringstream sstream; 
    sstream.imbue(locale(locale::classic(), output_facet)); 
    sstream.imbue(locale(sstream.getloc() , input_facet)); 

    string format("%d/%m/%Y %H:%M:%S.%f"); //example works fine without %f!!! 
    //format = "%H"; //-> works 
    //format = "%f"; //-> error 
    output_facet->format(format.c_str()); 
    input_facet->format(format.c_str()); 

    ptime dt = microsec_clock().local_time(); 

    sstream.str(""); 
    sstream << dt; 
    cout << sstream.str() << endl; 
    string time_string = sstream.str(); 

    ptime tgtDt(boost::date_time::not_a_date_time); 
    sstream.str(time_string.c_str()); 
    sstream >> tgtDt; 
    cout << tgtDt << endl; 
} 

プログラムは、フォーマット文字列内の%fをせずに細かい動作します。しかし、%f tgtDtは "not-a-date-time"です。私はすべての入力互換性のないフォーマットフラグが "!"でマークされているので、私はブースト1.44を使用し、%fは仕事をsholdしています。ドキュメントに記載されています。

文字列からfracの部分を取り除く方法はありますか?

答えて

1

[OK]を、(!それはドットとは何かを知っていた)、それを考え出した.. 入力ファセットと出力ファセットが異なるフォーマットを期待する..次のことを試してください。

string inputformat("%d/%m/%Y %H:%M:%S%f"); //no dot before %f 
string format("%d/%m/%Y %H:%M:%S.%f"); //dot before %f 
output_facet->format(format.c_str()); 
input_facet->format(inputformat.c_str()); 
+0

いや、同じことが。あなたは好きなようにフォーマット文字列を減らすことができます。 "%H"はうまく動作しますが、 "%f"は – DrFroid

+0

興味深いことに、首都Fは動作しているようです。 – StevieG

+0

元の答えを正しいものと編集しました! – StevieG