В perl всегда есть несколько способов сделать что-то. Вот тот, который использует только модуль, который поставляется в стандартной комплектации с Perl:
#! perl -w
use strict;
use Time::Local;
my $d1 = "Feb 3 12:03:20";
my $d2 = "Feb 4 00:00:30";
# Your date formats don't include the year, so
# figure out some kind of default.
use constant Year => 2012;
# Convert your date strings to Unix/perl style time in seconds
# The main problems you have here are:
# * parsing the date formats
# * converting the month string to a number from 1 to 11
sub convert
{
my $dstring = shift;
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);
if ($dstring =~ /(\S+)\s+(\d+)\s+(\d{2}):(\d{2}):(\d{2})/)
{
my ($month, $day, $h, $m, $s) = ($1, $2, $3, $4, $5);
my $mnumber = $m{$month}; # production code should handle errors here
timelocal($s, $m, $h, $day, $mnumber, Year - 1900);
}
else
{
die "Format not recognized: ", $dstring, "\n";
}
}
my $t1 = convert($d1);
my $t2 = convert($d2);
print "Diff (seconds) = ", $t2 - $t1, "\n";
Чтобы сделать это действительно готовый к производству, она нуждается в лучшей управляемости в год (например, то, что происходит, когда дата начала декабря и в конце дата в январе?) и лучшая обработка ошибок (например, что произойдет, если аббревиатура месяца с 3 символами неверно?).
wow ... путь больше, чем я ожидал ... спасибо –
@xivix, это излишне сложно для того, что вы хотите. [Ответ vmpstr] (http://stackoverflow.com/a/9134822/132382) полностью работоспособен. – pilcrow
Все зависит от того, сколько модулей вы можете использовать или будете использовать. См. Ответ @vmpstr, используя Date :: Parse. Если установка этого модуля является приемлемой, перейдите к ней. Вероятно, это улучшает работу с различными форматами данных и возможными ошибками, чем этот короткий фрагмент кода. – theglauber