のんびりしているエンジニアの日記

ソフトウェアなどのエンジニア的な何かを書きます。

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で合体をさせることもできます。

参考文献

Gregorian - 1.49.0

全ソースコード

#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;
}