たまたま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 件のコメント:
コメントを投稿