Boost.Chrono/Dateが開発中らしい

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

できてほしいことが、非常に自然な形で実現されてて、とてもすばらしいです。
これは楽しみですね。