2013年のBoostのGoogle Summer of Codeプロジェクトを眺めていたら、こんなのがありました。
Boost.Chrono/Date
Complete the Boost.ChronoDate [1] library based on [2] to make it ready for review.
[1] https://svn.boost.org/svn/boost/sandbox/chrono_date/
[2] https://svn.boost.org/svn/boost/sandbox/chrono_date/libs/date/doc/date.html
This project will be mentored by Vicente J. Botet Escriba
今まで時間のみを扱っていたBoost.Chronoですが、日付を扱うプロジェクトが進められているようです。
ドキュメントを見てみたら、すでにかなりすばらしい設計になっていました。
まず、年、月、日を、好きな順番で組み合わせてdateオブジェクトを作れます。
int m, d, y; // give values to m, d and y ... date d1 = year(y) / month(m) / day(d); // ymd ok date d2 = month(m) / day(d) / year(y); // mdy ok date d3 = day(d) / month(m) / year(y); // dmy ok
2011年5月の、「第2週の日曜日」を取得できます。
date MothersDay = sun[2]/may/2011; // may/8/2011 date MothersDay = sun[_2nd]/may/2011; // may/8/2011
日付の演算ももちろんできます。
// 1年ずつ足していく for (date d = feb/day(28)/2010, e = feb/day(28)/2020; d != e; d += years(1)) std::cout << d << '\n';
2010-02-28 2011-02-28 2012-02-28 2013-02-28 2014-02-28 2015-02-28 2016-02-28 2017-02-28 2018-02-28 2019-02-28
できてほしいことが、非常に自然な形で実現されてて、とてもすばらしいです。
これは楽しみですね。