iRSSの日記

はてなダイアリーiRSSの日記の続き

Time::Peaceを使うときの注意

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;