2013-08-02 6 views
-1

Есть ли способ вычесть время в нижнем формате, чтобы дать разницу во времени, не используя модуль perl?Вычисление разницы во времени вычитанием

Я ожидаю результат, как:

05:16:54:365 - 05:16:51:209 = 000003.156000 

, если требуется, то, что Perl модуль может быть использован здесь?

+1

Я бы сказал, что ваш лучший выбор - [DateTime] (https://metacpan.org/module/DateTime). – squiguy

+1

См. Тесно связанный вопрос [Преобразование абсолютного времени в относительное время] (http://stackoverflow.com/questions/17986013/convert-absolute-time-into-relative-time), также заданный пользователем [user381862] (http: // stackoverflow .com/пользователей/381862/user381862). Вам уже сказали, что это может быть семейство модулей [DateTime] (http://search.cpan.org/perldoc?DateTime). Да, вы можете довольно легко написать функцию, чтобы взять две строки в показанном формате и дать ответ в показанном формате - здесь возникают вопросы «что вы пробовали». –

ответ

1

С некоторыми довольно большими оговорками, этот код делает работу вам нужно для данных Дан:

#!/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 не является долговременным приемлемым решением.

Смежные вопросы