Perl 用减法计算时差

Perl 用减法计算时差,perl,Perl,是否有任何方法可以在不使用perl模块的情况下,以下面的格式减去时间来给出时间差 我期待的结果是: 05:16:54:365 - 05:16:51:209 = 000003.156000 如果需要,这里可以使用什么perl模块?有一些相当大的保留,这段代码完成了您所需的数据工作: #!/usr/bin/env perl use strict; use warnings; use Test::Simple tests => 1; sub time_check { my($tv

是否有任何方法可以在不使用perl模块的情况下,以下面的格式减去时间来给出时间差

我期待的结果是:

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

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

有一些相当大的保留,这段代码完成了您所需的数据工作:

#!/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");
#/usr/bin/env perl
严格使用;
使用警告;
使用测试::简单测试=>1;
分时检查
{
我的($tv、$hh、$mm、$ss、$ms)=@;
如果$hh<0 | |$hh>23,则“小时($hh)超出$tv中的00..23范围”;
如果$mm<0 | |$mm>59,则在$tv中“分钟($mm)超出范围00..59”;
如果$ss<0 | |$ss>59,则在$tv中死亡“秒$(ss)超出范围00..59”;
如果$ms<0 | |$ms>999,则在$tv中“毫秒($ms)超出范围000..999”;
返回;
}
子时间单位秒
{
我的($tm)=@;
我的($hh,$mm,$ss,$ms)=拆分/:/,$tm;
时间检查($tm、$hh、$mm、$ss、$ms);
my$rv=($hh*60+$mm)*60+$ss+($ms/1000.0);
返回$rv;
}
子时间差
{
我的($s1,$s2)=@;
my$t1=时间(秒)(s1);
my$t2=时间和秒数($s2);
my$rv=sprintf“%013.6f”,$t1-$t2;
返回$rv;
}
我的$v1=“05:16:54:365”;
我的$v2=“05:16:51:209”;
我的$ev=“000003.156000”;
ok(时间差($v1,$v2)等于$ev,“时间差$v1-$v2=$ev”);
一个更大的问题是,如果不为毫秒值指定所有三位数字,则会误解时间。也就是说,
05:16:54:36
将被视为
05:16:54:036
05:16:54:3
将被视为
05:16:54:003
。从给定的一对时间值来看,还不清楚是否会得到负面结果(颠倒两个值的顺序?),如果是,所需的格式是什么。我假设这些值被限制为表示24小时时钟上的时间,但我拒绝将
24:00:00:000
作为一天结束时的午夜(这可能很有用)。等等。这些是真正的日历模块将要处理的细节。错误处理非常糟糕<代码>模具不是长期可接受的解决方案

我认为你们最好的选择是。参见同样被问到的密切相关的问题。您已经被告知模块系列可以完成这项工作。是的,您可以相当轻松地编写一个函数,以显示的格式获取两个字符串,并以显示的格式生成答案-这就是“您尝试了什么”问题出现的地方。