Доброго времени суток.
Сабж. Три момента:
- DateTime::Format::Strptime крайне тормозной. В 60 ( !!! ) раз медленнее, чем если самому парсить строку и преобразовывать через Time::Local. Притом что я ни разу не программист и никакой оптимизации не делал.
Через DateTime::Format::Strptime :
use DateTime::Format::Strptime; [...] my $strp = DateTime::Format::Strptime->new( pattern => '%b %e, %Y %H:%M:%S.%N %Z', time_zone => 'local', ); my $ut_strp = DateTime::Format::Strptime->new( pattern => '%s', time_zone => 'local', ); my $start_time = $ut_strp->format_datetime( $strp->parse_datetime($start_time_str) ); my $end_time = $ut_strp->format_datetime( $strp->parse_datetime($end_time_str) );
time { cat test | ./test_strptime.pl > test2 ; } real 31m27.591s user 20m20.728s sys 11m2.277s
через велосипед :
use Time::Local; [...] sub str2ut($) { my $time_shift; $_[0] =~ /^(\S+)\s+(\d+),\s+(\d{4})\s([0-9]{2}):([0-9]{2}):([0-9]{2})\.(\d{9})\s+(\S+)$/ || print "can't decode date $_[0]"; my ( $month, $day, $year, $hour, $min, $sec, $nsec, $tzone ) = ( $1, $2, $3, $4, $5, $6, $7, $8 ); my %m=( "Jan" => 0, "Feb"=>1,"Mar"=>2,"Apr"=>3,"May"=>4,"Jun"=>5,"Jul"=>6, "Aug"=>7,"Sep"=>8,"Oct"=>9,"Nov"=>10,"Dec"=>11, "Янв" => 0, "Фев" => 1, "Мар" => 2, "Апр" => 3, "Май" => 4, "Июн" => 5, "Июл" => 6, "Авг" => 7, "Сен" => 8, "Окт" => 9, "Ноя" => 10, "Дек" => 11 ); my $time_shift = 0; return timelocal($sec,$min,$hour,$day,$m{$month},$year) + $time_shift * 60 * 60; } [...] my $start_time = str2ut($start_time_str); my $end_time = str2ut($end_time_str);
time { cat test | ./test_timelocal.pl > test2 ; } real 0m25.730s user 0m23.097s sys 0m2.612s
- Time::Piece пробовал, но заставить его работать не получилось
Error parsing time at /usr/lib/perl/5.14/Time/Piece.pm line 469, <> line 1.
- Таскать за собой свои велосипеды не хотелось бы
Пример строки:
Aug 6, 2013 17:03:04.453686000 MSK