Boost::Date 日付管理を行うライブラリ
Sponsored Links
皆さんこんにちは
お元気ですか。私は元気です。
さて、今日はBoostの中にある日付管理のライブラリを解説します。
現在の日付を表示したり、間の日付を計算したり日付に関する処理を行うことができます。
コンパイルオプション
g++ date.cpp -lboost_date_time
ヘッダー
#include <boost/date_time/gregorian/gregorian.hpp> #include "boost/date_time/gregorian/gregorian_types.hpp"
dateオブジェクトを作成
基本はdateオブジェクトを作ります。
ソースコード
date day1(2014,3,31); date today = day_clock::local_day(); //現在の年、月、日を表示する cout << today << endl; //年月日はそれぞれのメソッドで取得 cout << today.year() << endl; cout << today.month() << endl; cout << today.day() << endl;
出力
2014-Jul-20 2014 Jul 20
表示
様々な形式で表示させてくれます。
String形式
cout << "SIMPLE_STRING:" << boost::gregorian::to_simple_string(today) << endl; cout << "ISO:" << boost::gregorian::to_iso_string(today) << endl; cout << "ISO EXTEND:"<< boost::gregorian::to_iso_extended_string(today) << endl;
出力
SIMPLE_STRING:2014-Jul-20 ISO:20140720 ISO EXTEND:2014-07-20
DataDuration
計算する為のオブジェクト
ソースコード
cout << today - day1 << endl;
cout << today + boost::gregorian::days(100) << endl;
出力
111 2014-Oct-28
DataPeriod
2つのdateを元にして作られる関数です。
2つの日付の間を計算したり、もう一つの同じdata_periodと組み合わせて様々な形で実行することができます。
一例が以下、
//data period(2つの間を比較する関数) boost::gregorian::date_period dp(date(2014,3,31),boost::gregorian::days(100)); cout << "開始日 / 終了日 / その次" << endl; cout << dp.begin() << " " << dp.last() << " " << dp.end() << endl; cout << "間は何日ありますか? " << dp.length() << endl; boost::gregorian::date_period dp2(date(2014,3,31),day_clock::local_day()); //intersectの実装 if(dp.intersects(dp2)){ cout << "範囲がかぶっています。" << endl; } cout << "data_periodをくっつけたもの" << endl; cout << dp.span(dp2) << endl; boost::gregorian::date_period merge_period = dp.merge(dp2); cout << "dpとdp2をマージする" << endl; cout << "開始日 / 終了日 / その次" << endl; cout << merge_period.begin() << " " << merge_period.last() << " " << merge_period.end() << endl; cout << "間は何日ありますか? " << merge_period.length() << endl;
出力
範囲がかぶっています。 data_periodをくっつけたもの [2014-Mar-31/2014-Jul-19] dpとdp2をマージする 開始日 / 終了日 / その次 2014-Mar-31 2014-Jul-19 2014-Jul-20 間は何日ありますか? 111
範囲の開始、終了を表示できる begin,end
intersectsで他のdata_periodの範囲に入るかどうか
mergeで合体をさせることもできます。
参考文献
全ソースコード
#include <boost/date_time/gregorian/gregorian.hpp> #include "boost/date_time/gregorian/gregorian_types.hpp" #include <iostream> using namespace std; using boost::gregorian::date; using boost::gregorian::day_clock; int main(int argc, char const *argv[]){ date day1(2014,3,31); date today = day_clock::local_day(); //現在の年、月、日を表示する cout << today << endl; //年月日はそれぞれのメソッドで取得 cout << today.year() << endl; cout << today.month() << endl; cout << today.day() << endl; //計算 cout << today - day1 << endl; cout << today + boost::gregorian::days(100) << endl; //それぞれの表示 cout << "SIMPLE_STRING:" << boost::gregorian::to_simple_string(today) << endl; cout << "ISO:" << boost::gregorian::to_iso_string(today) << endl; cout << "ISO EXTEND:"<< boost::gregorian::to_iso_extended_string(today) << endl; //data period(2つの間を比較する関数) boost::gregorian::date_period dp(date(2014,3,31),boost::gregorian::days(100)); cout << "開始日 / 終了日 / その次" << endl; cout << dp.begin() << " " << dp.last() << " " << dp.end() << endl; cout << "間は何日ありますか? " << dp.length() << endl; boost::gregorian::date_period dp2(date(2014,3,31),day_clock::local_day()); //intersectの実装 if(dp.intersects(dp2)){ cout << "範囲がかぶっています。" << endl; } cout << "data_periodをくっつけたもの" << endl; cout << dp.span(dp2) << endl; boost::gregorian::date_period merge_period = dp.merge(dp2); cout << "dpとdp2をマージする" << endl; cout << "開始日 / 終了日 / その次" << endl; cout << merge_period.begin() << " " << merge_period.last() << " " << merge_period.end() << endl; cout << "間は何日ありますか? " << merge_period.length() << endl; return 0; }