ぴぐノート

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++

執筆者:

関連記事

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

昨日に続き、プログレスバーをマルチスレッドを用いて実装してみましょう。 作成の目的は、 スレッド実行中はモーダルダイアログを表示させること。 モーダルダイアログではプログレスバーを表示し進捗が分かるこ …

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

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

【OpenCV】MFCのピクチャーコントロールに描画しよう!

前回、OpenCVを使って画像の回転や二値化などを行って動作確認をしました。 今回はMFCでダイアログベースのアプリケーションを作成し、ピクチャーコントロールにOpenCVで読み込んだ画像を表示させて …

【MFC】フォルダー選択ダイアログの表示【Visual C++】

出力先の指定などフォルダー選択のダイアログを表示させたいことがあります。 フォルダー選択ダイアログを表示させるためには、SHBrowseForFolder関数を使います。 SHBrowseForFol …

C++でインターフェイスを作成しよう。

私事ですが今後業務ではC++を使用することになりそうです。 今まではウェブ関連の業務であったり、ちょっとしたテスト程度だったのでJavaを中心に使っていたため、C++の文法など少し忘れ気味です&#82 …