2009年5月12日(火曜日)
DateTime::Durationでハマる
公開: 2009年5月13日21時5分頃
PerlのDateTime.pm (search.cpan.org)は名前の通り日付や時間を扱うモジュールです。こんなコードを実行すると、
use strict;
use DateTime;
my $dt1 = DateTime->new(year => 2009, month => 4, day => 1);
my $dt2 = DateTime->today;
print "$dt1\n";
print "$dt2\n";
こうなります。
2009-04-01T00:00:00
2009-05-12T00:00:00
ところで、複数の日付からその差の日数を求めたいことが良くあります。DateTimeでは、あるDateTimeオブジェクトから別のDateTimeを引き算して、その差を求めることができます。差はDateTime::Duration (search.cpan.org)のオブジェクトとして返されます。
というわけで、4月1日から今日(5月12日)までの日数を求めるべく、先ほどのコードに続けてこんなふうに書くと……。
my $dur = $dt2 - $dt1;
print $dur->delta_days;
結果はこうなるわけですよ。
11
「11」……いやいや、そんなアホなと。どうも、DateTime::Duration はこの場合「1ヶ月と11日」という形で差分を持つようで、1ヶ月が何日なのかは月によって異なるため、差が合計何日なのかは算出できないようです。……なんだその言い訳。
そもそも、引くときに delta_days メソッドを使う必要があるようです。
my $dur = $dt2->delta_days($dt1);
print $dur->delta_days;
これで「41」が得られます。これはちょっとわかりにくいですよ……。
※ちなみに、調べている途中でぶち切れて、 ($dt2->epoch - $dt1->epoch) / (60*60*24); で済ませようとしてしまったのは内緒です。:-)
- 「DateTime::Durationでハマる」にコメントを書く
- 前(古い): 2009年5月11日(Monday)のえび日記
- 次(新しい): 2009年5月14日(Thursday)のえび日記