perlモジュールを使用せずに、以下の形式で時間を減算して時差を与える方法はありますか?
私は次のような結果を期待しています:
05:16:54:365 - 05:16:51:209 = 000003.156000
必要な場合、ここでどの 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, $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");
大きな問題の 1 つは、ミリ秒の値に 3 桁すべてを指定しないと、時刻を誤って解釈することです。つまり、05:16:54:36
は として扱われ05:16:54:036
、05:16:54:3
は として扱われ05:16:54:003
ます。また、指定された時間値のペアから、負の結果が得られるかどうか (2 つの値の順序を逆にするかどうか) も明確ではありません。値は 24 時間制の時刻を表すように制約されていると想定しましたが24:00:00:000
、1 日の終わりの真夜中を拒否しました (これは便利かもしれません)。これらは、実際のカレンダー モジュールが処理する詳細です。エラー処理はひどいものです。die
長期的に受け入れられる解決策ではありません。