Time::Piece->strptime('2007/07/28T00:00:00', "%Y/%m/%dT%H:%M:%S")
は、グリニッジ標準時で作成される。
なので
my $t = Time::Piece->strptime('2007/07/28T00:00:00', "%Y/%m/%dT%H:%M:%S")->epoch
このエポック($t)はグリニッジ標準時のエポックである。
timeで取得したエポックはローカル(東京標準時)になるので-9時間分引かれているので
今東京時間が2007/07/28午前1時のとき
$t < time
は成立しなくなる。
このケースでは Time::Piece.strptimeはタイムゾーンを指定できないので、使いにくい
お試しスクリプト
use Time::Piece; use Time::Local; warn timelocal(0,0,0,28,7-1,2007-1900); my $t = Time::Piece->strptime('2007/07/28T00:00:00', "%Y/%m/%dT%H:%M:%S"); warn $t->epoch;
代わりにどうするか。DateTime::Format::Strptimeを使いましょう
use DateTime::Format::Strptime; use Time::Local; warn timelocal(0,0,0,28,7-1,2007-1900); my $t = DateTime::Format::Strptime->new (pattern=>"%Y/%m/%dT%H:%M:%S",time_zone=>"local")->parse_datetime('2007/07/28T00:00:00'); warn $t->epoch;