通过减法计算时间差

时间:2013-08-02 03:40:06

标签: perl

有没有办法以下面的格式减去时间来给出时间差,而不使用perl模块?

我期待的结果如下:

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

如果需要,可以在这里使用什么perl模块?

1 个答案:

答案 0 :(得分: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:03605:16:54:3将被视为05:16:54:003。从给出的时间值对中是否可以得到负结果(反转两个值的顺序?)也是不清楚的,如果是,那么所需的格式是什么。我假设这些值被约束为代表24小时制的时间,但我已经拒绝24:00:00:000作为当天结束的午夜(这可能是有用的)。等等。这些是真实日历模块将处理的细节。错误处理是可恶的; die不是长期可接受的解决方案。