2010/09/23

Boost date_time で、フォーマット入力と出力

たまたまtwitterで、boostのdate_timeでフォーマット入出力が上手くいかないとの
ことだったので、作ってみた。
環境は
  • g++
  • boost 1.43.0
手順は以下のとおり
  1. ファセットの定義
  2. 入力元 出力先 に使用するストリームの宣言
  3. ldtを宣言(いちおう、元データを設定)
  4. ストリームに、ファセットを設定(localeは、ssのものをそのまま設定)
  5. 時間の文字列を文字列ストリームに設定
  6. 入力用ファセットにフォーマットを指定
  7. 読み込み
  8. 文字列ストリームをクリア
  9. 出力用ファセットにフォーマットを指定
  10. 書き込み
  11. 画面表示

ちなみに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 件のコメント:

コメントを投稿