我试图用以下格式计算两个时间戳之间的差异:
15:45:30.125
我尝试过在Perl中使用Date :: Parse包,其中包含以下内容:
my $s1 = str2time( $timestamp1 );
my $s2 = str2time( $timestamp2 );
并简单地减去$ s1和$ s2以找出差异,但它只是四舍五入到最接近的秒而不是包括毫秒...是否有一种替代方法或在减去值时包含毫秒计数的方法? / p>
答案 0 :(得分:1)
我建议您使用Time::HiRes::Value
模块,该模块支持对包含单独的秒和微秒值的对象进行算术运算 - 与Time::HiRes::gettimeofday
返回的值相同。它还提供了方便的字符串化重载
你需要写一个简单的解析子程序,比如这个
use strict;
use warnings;
use Time::HiRes::Value;
my $t0 = parse_time('15:45:30.125');
my $t1 = parse_time('18:12:46.886');
print $t1 - $t0;
sub parse_time {
my ($h, $m, $s, $ms) = shift =~ /\d+/g;
Time::HiRes::Value->new(($h * 60 + $m) * 60 + $s, $ms * 1000);
}
<强>输出强>
8836.761000
答案 1 :(得分:0)
如果您有时间的日期和时区,则可以使用以下内容:
$ perl -MDateTime::Format::Strptime -E'
my $format = DateTime::Format::Strptime->new(
pattern => "%Y-%m-%d %H:%M:%S.%3N",
time_zone => "local",
on_error => "croak",
);
my $dt1 = $format->parse_datetime("2015-10-01 00:00:00.000");
my $dt2 = $format->parse_datetime("2015-10-01 03:00:00.100");
say $dt2->subtract_datetime_absolute($dt1)->seconds
+ ( $dt2 - $dt1 )->nanoseconds / 1e9;
'
10800.1
如果您没有时间的日期和时区,那么您所要求的是不可能的。观察改变日期的方式如何改变结果。
$ perl -MDateTime::Format::Strptime -E'
my $format = DateTime::Format::Strptime->new(
pattern => "%Y-%m-%d %H:%M:%S.%3N",
time_zone => "local",
on_error => "croak",
);
my $dt1 = $format->parse_datetime("2015-11-01 00:00:00.000");
my $dt2 = $format->parse_datetime("2015-11-01 03:00:00.100");
say $dt2->subtract_datetime_absolute($dt1)->seconds
+ ( $dt2 - $dt1 )->nanoseconds / 1e9;
'
14400.1
如果您碰巧知道时区,并且该时区恰好是UTC,并且如果您可以在一秒钟之前关闭,那么可以在不知道日期的情况下给出答案。
my $s1 = str2time( $timestamp1 ) + ( $timestamp1 =~ /(\.\d+)/ ? $1 : 0 );