たまたまtwitterで、boostのdate_timeでフォーマット入出力が上手くいかないとの
ことだったので、作ってみた。
環境は
- g++
- boost 1.43.0
手順は以下のとおり
- ファセットの定義
- 入力元 出力先 に使用するストリームの宣言
- ldtを宣言(いちおう、元データを設定)
- ストリームに、ファセットを設定(localeは、ssのものをそのまま設定)
- 時間の文字列を文字列ストリームに設定
- 入力用ファセットにフォーマットを指定
- 読み込み
- 文字列ストリームをクリア
- 出力用ファセットにフォーマットを指定
- 書き込み
- 画面表示
ちなみに1.でファセットをポインタで宣言していますが、
これは、ストリームがファセットを自動で開放するためです。
ちなみに、deleteとかすると Segmentation fault です。
ソースコードは
- #include <locale>
- #include <iostream>
- #include <sstream>
- #include <boost/date_time.hpp>
- #include <boost/date_time/posix_time/posix_time.hpp>
- #include <boost/date_time/local_time/local_time.hpp>
- int main()
- {
- // 1. ファセットの定義
- boost::local_time::local_time_facet* outputFacet =
- new boost::local_time::local_time_facet();
- boost::local_time::local_time_input_facet* inputFacet =
- new boost::local_time::local_time_input_facet();
- // 2. 入力元 出力先 に使用するストリームの宣言
- std::stringstream ss;
- // 3. 入力元 出力先 に使用するストリームの宣言
- boost::local_time::local_date_time ldt =
- boost::local_time::local_sec_clock::local_time(
- boost::local_time::time_zone_ptr() );
- // 4. ストリームに、ファセットを設定(localeは、ssのものをそのまま設定)
- ss.imbue( std::locale( ss.getloc(), outputFacet ) );
- ss.imbue( std::locale( ss.getloc(), inputFacet ) );
- // 5. 時間の文字列を文字列ストリームに設定
- ss.str( "Mon, 10 Aug 2009 17:12:34" );
- // 6. 入力ファセットにフォーマットを指定
- inputFacet->format( "%a, %d %b %Y %H:%M:%S" );
- // 7. 読み込み
- ss >> ldt;
- // 一応デバッグのため、時間をばらして出力
- boost::posix_time::ptime pt = ldt.local_time();
- boost::gregorian::date d = pt.date();
- boost::posix_time::time_duration t = pt.time_of_day();
- std::cout << "Year : " << d.year() << std::endl;
- std::cout << "Month : " << d.month() << std::endl;
- std::cout << "Date : " << d.day() << std::endl;
- std::cout << "Hour : " << t.hours() << std::endl;
- std::cout << "Minute : " << t.minutes() << std::endl;
- std::cout << "Second : " << t.seconds() << std::endl;
- // 8. 文字列ストリームをクリア
- ss.str( "" );
- // 9. 出力用ファセットにフォーマット指定
- outputFacet->format( "%a, %d %b %H:%M:%S" );
- // 10. 書き込み
- ss << ldt;
- // 11. 画面表示
- std::cout << ss.str() << std::endl;
- return 0;
- }
0 件のコメント:
コメントを投稿