ぴぐノート

Good code is its own best documentation.

Boost C/C++

【Boost】Boostライブラリの日付を使ってみよう!

投稿日:2017年7月9日 更新日:

先日の記事でBoostをインストールできたのでBoostのライブラリを使って遊んでみましょう。
今回は日付に関する情報をBoostから取得・表示したり、〇月〇日~□月□日が何日間あるか(期間)取得してみましょう。

日付を利用するには gregorian.hpplibboost_date_time.lib が必要です。
ヘッダーファイルと静的ライブラリの生成についてはこちらの記事を確認してみて下さいネ。

何が必要なのか確認しよう!

では具体的にBoostの日付を利用するためにはどのファイルが必要になるのでしょうか。

ライブラリ(debug版) libboost_date_time-vc141-mt-gd-1_64.lib
ライブラリ(Release版) libboost_date_time-vc141-mt-1_64.lib
ヘッダーファイル boost/date_time/gregorian/gregorian.hpp

** ビルド時の環境によってライブラリファイル名が異なります
** 私のビルド時はVisual Studio 2017環境だったため、”vc141″が含まれています

サンプルプログラムを作ってみよう!

先にサンプルプログラムを見て実際にプログラムを作ってみましょう。

** サンプルプログラムでは名前空間をすべて記述していますが、実際に利用する場合は using namespace を使って少しでも見やすくなるようにした方が良さそうです。
** もちろん名前の競合には気を付けてくださいネ。

どんな場合に使えるか考えてみる!

うーん、出力するファイル名に付与して日ごとのファイル管理などにも使えるでしょうか。

他にも処理日と処理内容をリスト化して表示する場合などで日付を扱いたくなる場合もありそうですネ。
この場合だと処理日から〇日間経過したら自動的に削除するなどで期間の計算なども必要になりそうです。

MFCなどで同じことをする場合は、CTimeクラスを使って日付を取得したり、CTime::Format関数でCString型を取得する感じになるでしょうか?

CTimeとboost::gregorian::date、どっちが早い?

そもそもCTimeは時刻もデータとして持っているので、boost::gregorian::dateの方が速そうな感じがします。
ざっくりしたテキトーなコードで確認してみます。

  1回目(ナノ秒) 2回目 3回目 4回目 5回目 平均
CTime(loop:1) 521,600 9,900 19,600 7,000 6,400 112,900
boost(loop:1) 73,700 21,500 18,000 13,800 13,100 28,020
CTime(loop:1,000) 901,900 484,700 483,900 489,100 483,800 568,680
boost(loop:1,000) 2,558,600 2,488,000 2,604,400 2,484,900 2,495,000 2,526,180

最適化の関係なのかCTimeでは初回に時間がかかりますが、その後は圧倒的に早いですね。
boost::gregorian::dateは1回ごとの速度に大きな差がないですが、比較すると遅く見えます。

ただし、今日の日付を1,000回確認するなんてことは実際にはないはずで、1度だけの確認で考えればboostの方が使いやすいように思います
環境依存が少ない点も考慮すればCTimeからboostへの置換も十分検討の余地がありそうですネ。

まとめ

アプリケーションを作るときに日付が!って悩むことは多くないですが、あるとちょっとだけ助かる場合は多いですよね。

単純に日付が欲しいだけであれば std::time を使った方が速度も早いですが日付を文字列に変換したり、文字列を日付に変換したり、期間を得たいといった場合はライブラリを使うと楽に操作できるかもしれませんネ。

スポンサーリンク

スポンサーリンク

-Boost, C/C++

執筆者:

関連記事

Eclipse NeonとCDT/MinGWでC++開発環境を作成しよう!(1)

MFCなどを利用する場合にはほぼVisualStudio一択ですが、簡単なコンソールアプリケーションを作る場合にはEclipseのほうが便利な場合も多いです。 特に「普段はJavaで開発を行っているけ …

【MFC入門】メッセージボックスにエラーコードを表示させよう

ライブラリなどを使用していると、戻り値にエラーコードを返す関数は比較的多いです。 GetLastError関数(最新のエラーコードを取得する関数)がライブラリに含まれていることもありますが、そうでない …

Eclipse NeonとCDT/MinGWでC++開発環境を作成しよう!(2)

前回の記事でEclipseにCDTを追加インストールすることができました。 今回はMinGWとMSYSをインストールし、Eclipse上でC++プロジェクトを実行してみましょう。 この際に必要なダウン …

C++のプリプロセッサの復習をしよう その2 【#defineの活用】

前回に引き続き、C++のプリプロセッサの復習です。 前回は#includeと#defineについて記事にしましたが、【まとめ】にも記載の通り、#defineと関連するプリプロセッサは多くあります。 今 …

【MFC】マルチスレッドでプログレスバーを実装しよう その3

プログレスバーをマルチスレッドを用いた実装について最後の記事です。 引き続き作成の目的は、 スレッド実行中はモーダルダイアログを表示させること。 モーダルダイアログではプログレスバーを表示し進捗が分か …