@kyanny's blog

My life. Opinions are my own.

DateTime::Span で日付の範囲を扱う

「今日の時点で20代の人は西暦何年の生まれなのか」を知りたくて、 CPAN を birth とかで検索してみたら DateTime-Span-Birthdate-0.03 - Date span of birthdays for an age - metacpan.org が見つかった。

my $span = DateTime::Span::Birthdate->new(from => 20, to => 29);
say $span->start->ymd;
say $span->end->ymd;

こんな風にして使う。

これで用は足りたのだけど、 DateTime::Span という名前空間を初めて知ったので親モジュールのほうも少し見てみた。 DateTime-Set-0.3900 - DateTime set objects - metacpan.org というシリーズらしい。

my $dt1 = DateTime->new(year => 1979, month => 7, day => 24);
my $dt2 = DateTime->new(year => 1980, month => 2, day => 27);

my $span = DateTime::Span->from_datetimes(start => $dt1, end => $dt2);
say $span->start->ymd;
say $span->end->ymd;

こんな風にして使う。日付の範囲をコマンドラインで指定して、一連の日付のリストに展開して何かする、みたいなスクリプトをいくつも書いてきて、そのたびに日付をパースする正規表現をコピペして使い回していたけど、「きっと CPAN の DateTime ファミリーの中に日付の範囲を扱うモジュールがあるよなぁ」と思っていた、その通りだった。見つけられてなかっただけだった。苦手な DateTime::Duration を使うことになるので、慣れるまで少し悩みそうだけど、今後はこれを使うようにしよう。

追記

http://b.hatena.ne.jp/typewhite/20090324#bookmark-12655091 にて「ヤン・ウェンリ−?」というコメントをいただいたが、気になるので説明してもらえると嬉しいです。ヤン・ウェンリーが銀河英雄伝説の主人公(の一人)であることは知っている(一巻だけ読んだことがある)けど、上の内容のどこらへんが銀河英雄伝説と関係あるのかがわからない。