С некоторыми довольно большими оговорками, этот код делает работу вам нужно для данных Дан:
#!/usr/bin/env perl
use strict;
use warnings;
use Test::Simple tests => 1;
sub time_check
{
my($tv, $hh, $mm, $ss, $ms) = @_;
die "Hours ($hh) out of range 00..23 in $tv" if $hh < 0 || $hh > 23;
die "Minutes ($mm) out of range 00..59 in $tv" if $mm < 0 || $mm > 59;
die "Seconds $(ss) out of range 00..59 in $tv" if $ss < 0 || $ss > 59;
die "Milliseconds ($ms) out of range 000..999 in $tv" if $ms < 0 || $ms > 999;
return;
}
sub time_seconds
{
my($tm) = @_;
my($hh, $mm, $ss, $ms) = split /:/, $tm;
time_check($tm, $hh, $mm, $ss, $ms);
my $rv = ($hh * 60 + $mm) * 60 + $ss + ($ms/1000.0);
return $rv;
}
sub time_diff
{
my($s1, $s2) = @_;
my $t1 = time_seconds($s1);
my $t2 = time_seconds($s2);
my $rv = sprintf "%013.6f", $t1 - $t2;
return $rv;
}
my $v1 = "05:16:54:365";
my $v2 = "05:16:51:209";
my $ev = "000003.156000";
ok(time_diff($v1, $v2) eq $ev, "time diff $v1 - $v2 = $ev");
Одна из самых больших проблем является то, что если вы не указать все три цифры для значения миллисекунды, вы будете неверно истолковывать время. То есть 05:16:54:36
будет обрабатываться как 05:16:54:036
, а 05:16:54:3
будет обрабатываться как 05:16:54:003
. Также неясно, из пары значений времени задано, сможете ли вы когда-либо получить отрицательные результаты (измените порядок двух значений?), И если да, то какой требуемый формат. Я предположил, что значения ограничены для представления времени на 24-часовых часах, но я отклонил 24:00:00:000
как полночь в конце дня (что может быть полезно). И т. Д. Это детали, с которыми будет работать настоящий календарный модуль. Обработка ошибок является отвратительной; die
не является долговременным приемлемым решением.
Я бы сказал, что ваш лучший выбор - [DateTime] (https://metacpan.org/module/DateTime). – squiguy
См. Тесно связанный вопрос [Преобразование абсолютного времени в относительное время] (http://stackoverflow.com/questions/17986013/convert-absolute-time-into-relative-time), также заданный пользователем [user381862] (http: // stackoverflow .com/пользователей/381862/user381862). Вам уже сказали, что это может быть семейство модулей [DateTime] (http://search.cpan.org/perldoc?DateTime). Да, вы можете довольно легко написать функцию, чтобы взять две строки в показанном формате и дать ответ в показанном формате - здесь возникают вопросы «что вы пробовали». –