水無月ばけらのえび日記

bakera.jp > 水無月ばけらのえび日記 > 2009年のえび日記 > 2009年5月 > 2009年5月12日(火曜日)

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); で済ませようとしてしまったのは内緒です。:-)

関連する話題: Perl / プログラミング / 失敗談

最近の日記

関わった本など