n日後の日付

例えば、2009年3月7日から1000日後の日付を求めたいことはよくあると思います。そんなとき、つい、月ごとの日数のテーブルを作って、閏年の判定を行って、といった処理を組み合わせて計算してしまいがちです。しかし、実際にはそんな面倒なことをする必要はありません。

mktime を使用する方法

標準Cライブラリの mktime 関数を使えば、1000日後の日付を簡単に求めることができます。ただし、time_t 型の表現範囲の制約を受けるため、いわゆる2038年問題のような不具合に遭遇する可能性もあるので要注意です。

#include <iostream>
#include <ctime>

int main()
{
  std::tm t = {};
  t.tm_year = -1900 + 2009;
  t.tm_mon  = -1 + 3;
  t.tm_mday = 7;

  // 1000日後
  t.tm_mday += 1000;
  if (std::mktime(&t) != (time_t)-1)
  {
    std::cout << std::asctime(&t) << std::endl;
  }
  return 0;
}

Boost.Date_Time を使う方法

Boost C++ Libraries を使える状況であれば、Boost.Date_Time を使うのが一番簡単で、しかも実用上はほぼ問題ないだけの表現範囲を得られます。

#include <iostream>
#include <boost/date_time/gregorian/gregorian.hpp>

int main()
{
  boost::gregorian::date d(2009, 3, 7);
  std::cout << (d + boost::gregorian::date_duration(1000)) << std::endl;
  return 0;
}

このエントリーを含むはてなブックマーク