perl(CPAN)のTime::PieceのstrptimeがError parsing time

CPANにあるTime::Pieceを使って、日付・時刻を解析しようとすると、エラーになる。

$ ./boardz2ki2.cgi
DEBUG:Fri Dec 17 04:41:20 UTC 2010
Error parsing time at /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi/Time/Piece.pm line 469.

こんなソース

my      $tzoffset = Time::Seconds->new(8*60*60);
print "DEBUG:$game_time\n";
my $tp = Time::Piece->strptime($game_time, "%a %b %d %T %Z %Y") + $tzoffset;
my $date = $tp->ymd("/")." ".$tp->hms(":");

原因

解析される文字列に問題がある。

  • UTC は %Z では扱えない (JSTも)。
    • RFC822 or ISO8601形式でないといけない
  • 月名が誤ってる

対処

文字列、または解析用文字列を適切に修正。上の例では、UTCしか渡ってこないはずなので、決め打ちで埋め込んで対応。

my      $tzoffset = Time::Seconds->new(8*60*60);
print "DEBUG:$game_time\n";
my $tp = Time::Piece->strptime($game_time, "%a %b %d %T UTC %Y") + $tzoffset;
my $date = $tp->ymd("/")." ".$tp->hms(":");

また、エラーメッセージを表示させたくない場合は、evalで括ると良い。

[[$$amazon-search-result-large books-jp perl]]