Perl:以hh:mm:ss,sss格式计算时间

occ*_*lti 1 format perl time milliseconds

我需要在Perl中计算这两个变量之间的时差:

my $end = "17:23:31,576";
my $start = "17:23:30,858";
Run Code Online (Sandbox Code Playgroud)

我如何计算时差($end - $start)?重要的是返回的值保持相同的格式.

理想情况下,我希望用原生功能来做到这一点

我已经试过像包Time::Piece;DateTime::Format::Strptime; 但无法使其发挥作用.

ike*_*ami 5

DateTime解决方案,因为它具有对小数秒的本机支持.获得两个DateTime对象后,可以使用以下程序:

# delta_ms loses nanoseconds, but we need it to convert days into hours.
my ($h, $m, $s) = $dt2->delta_ms($dt1)->in_units(qw( hours minutes seconds ));
my $ns = ( $dt2 - $dt1 )->nanoseconds;

say sprintf '%d:%02d:%02d,%03.0f', $h, $m, $s, $ns/1_000_000;
Run Code Online (Sandbox Code Playgroud)

现在,让我们看看如何获​​取两个DateTime对象.根据提供的信息,您可以做的最好的事情如下:

use DateTime::Format::Strptime qw( );

my $format = DateTime::Format::Strptime->new(
   pattern   => '%H:%M:%S,%3N',
   time_zone => 'floating',
   on_error  => 'croak',
);

my $dt1 = $format->parse_datetime('01:59:58,123');
my $dt2 = $format->parse_datetime('03:01:02,456');
Run Code Online (Sandbox Code Playgroud)

与所有其他解决方案一样,这并不总能给出正确答案,因为差异可能取决于日期和时区(例如,由于DST更改),并且此信息无法提供.

如果您确实拥有可用的信息,那么您将使用以下内容,而1:01:04,333不是0:01:04,333在DST开始的当天.

use DateTime::Format::Strptime qw( );

my $format = DateTime::Format::Strptime->new(
   pattern   => '%Y-%m-%d %H:%M:%S,%3N',
   time_zone => 'America/New_York',  # Often: 'local'
   on_error  => 'croak',
);

my $dt1 = $format->parse_datetime('2015-03-09 01:59:58,000');
my $dt2 = $format->parse_datetime('2015-03-09 03:01:02,000');
Run Code Online (Sandbox Code Playgroud)