たとえば、ctimeフォーマットの文字列をパースする場合(twitterのcreated_atフィールドが相当)、Time::Pieceのstrptimeを使えば以下のようにかける。
$ perl -MTime::Piece -le 'my $t = Time::Piece->strptime("Mon Aug 23 12:44:51 +0000 2010", "%a %b %d %H:%M:%S %z %Y"); print $t->datetime;'
2010-08-23T12:44:51
同様にDateTime::Format::Strptimeを使う場合以下のようにかける。
$ perl -MDateTime::Format::Strptime -le 'my $parser = DateTime::Format::Strptime->new(pattern=>"%a %b %d %H:%M:%S %z %Y"); my $dt = $parser->parse_datetime("Mon Aug 23 12:44:51 +0000 2010"); print $dt->datetime;'
2010-08-23T12:44:51
ベンチマークの結果は以下。Time::PieceのstrptimeはDateTime::Format::Strptimeに比べて47倍程度高速。サブルーチンの呼び出しごとにパーサを定義する必要の無いDateTime::Format::Strptimeの方が低速だったのは驚き。Time::PieceはCで書かれたstrptimeを呼び出しているから高速なのかな?
$ perl test.pl
Benchmark: timing 10000 iterations of TEST1, TEST2...
TEST1: 0 wallclock secs ( 0.66 usr + 0.00 sys = 0.66 CPU) @ 15151.52/s (n=10000)
TEST2: 33 wallclock secs (31.83 usr + 0.03 sys = 31.86 CPU) @ 313.87/s (n=10000)
Rate TEST2 TEST1
TEST2 314/s -- -98%
TEST1 15152/s 4727% --
$ cat test.pl
#! /usr/bin/perl -w
use strict;
use warnings;
use Benchmark qw/cmpthese timethese/;
use Time::Piece;
use DateTime::Format::Strptime;
my $count = 10000;
my $date = "Mon Aug 23 12:44:51 +0000 2010";
my $parser = DateTime::Format::Strptime->new(pattern=>"%a %b %d %H:%M:%S %z %Y");
cmpthese(
timethese($count,
{'TEST1' => '&test1;', 'TEST2' => '&test2;', })
);
exit;
sub test1 {
my $t = Time::Piece->strptime($date, "%a %b %d %H:%M:%S %z %Y");
$t->datetime;
}
sub test2 {
my $dt = $parser->parse_datetime($date);
$dt->datetime;
}
__END__