Time::Pieceのバグ?newからのオブジェクトとstrftimeからのオブジェクトの引き算がおかしい
perlにTime::Pieceという便利なライブラリがありますが、newから作成したオブジェクトとstrftimeから作成したオブジェクトの引き算をすると誤作動するようです。
use Time::Piece; my $now = new Time::Piece(time()); my $now_from_strptime = Time::Piece->strptime($now->strftime('%Y-%m-%d %H:%M'),'%Y-%m-%d %H:%M'); my $today_str = $now->strftime('%Y-%m-%d'); my $from_str = $today_str.' 12:00'; my $to_str = $today_str.' 15:00'; my $from = Time::Piece->strptime($from_str,'%Y-%m-%d %H:%M'); my $to = Time::Piece->strptime($to_str,'%Y-%m-%d %H:%M'); my $now_minus_from = $now - $from; my $to_minus_now = $to - $now; my $to_minus_from = $to - $from; my $from_minus_to = $from - $to; my $to_minus_now_strp = $to - $now_from_strptime; my $now_strp_minus_from = $now_from_strptime - $from; print <<EOT; # 基本時間の定義 now: $now now_from_strptime: $now_from_strptime from: $from to: $to # strftimeから作成したもの同士の引き算は正常に動く to-from: $to_minus_from # newから作ったものと、strftimeから作成したものの引き算はおかしい now-from: $now_minus_from to-now: $to_minus_now # newから作ったものでも、strftimeで作りなおせばOK now_strf-from: $now_strp_minus_from to-now_strf: $to_minus_now_strp EOT 1;で、実行結果が下記です。
# 基本時間の定義 now: Sat Sep 21 22:14:48 2013 now_from_strptime: Sat Sep 21 22:14:00 2013 from: Sat Sep 21 12:00:00 2013 to: Sat Sep 21 15:00:00 2013 # strftimeから作成したもの同士の引き算は正常に動く to-from: 10800 # newから作ったものと、strftimeから作成したものの引き算はおかしい now-from: 4488 to-now: 6312 # newから作ったものでも、strftimeで作りなおせばOK now_strf-from: 36840 to-now_strf: -26040やっているのは、nowを現在時刻でnewにより作り、それよりも過去のfromとtoという2つの時刻をstrftimeで作成。Time::Pieceオブジェクト同士の引き算を文字列で評価すると秒数になるのですが、明らかに挙動がおかしいです。3つのオブジェクトを普通にprintしてみると、一見ちゃんと作れてるっぽくはあるのですが。
そこで、nowから一度strptimeで文字列時刻を取り出してstrftimeで作りなおして再度引き算してやるとうまくいきます。
Time::Pieceにおいてnewは使わない方が良いのかな…。