Perl - 计算两个时间戳之间的差异

时间:2015-04-09 18:29:04

标签: perl date

我试图用以下格式计算两个时间戳之间的差异:

15:45:30.125

我尝试过在Perl中使用Date :: Parse包,其中包含以下内容:

my $s1 = str2time( $timestamp1 );
my $s2 = str2time( $timestamp2 );

并简单地减去$ s1和$ s2以找出差异,但它只是四舍五入到最接近的秒而不是包括毫秒...是否有一种替代方法或在减去值时包含毫秒计数的方法? / p>

2 个答案:

答案 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 );