例えば、2009年3月7日から1000日後の日付を求めたいことはよくあると思います。そんなとき、つい、月ごとの日数のテーブルを作って、閏年の判定を行って、といった処理を組み合わせて計算してしまいがちです。しかし、実際にはそんな面倒なことをする必要はありません。
mktime を使用する方法
標準Cライブラリの mktime 関数を使えば、1000日後の日付を簡単に求めることができます。ただし、time_t 型の表現範囲の制約を受けるため、いわゆる2038年問題のような不具合に遭遇する可能性もあるので要注意です。
#include <iostream>
#include <ctime>
#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>
#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;
}

