如何在perl中获得两个日期时间字符串的日期和时间差异?

时间:2017-02-13 03:47:22

标签: perl datetime

我有两个日期时间字符串:

$bstr = 02/07/17 09:25:22
$betr = 02/07/17 10:55:48
my $bstrDateTime = DateTime->from_epoch( epoch => str2time( $bstr ) );
my $betrDateTime = DateTime->from_epoch( epoch => str2time( $betr ) );
my $diff = $betrDateTime->subtract_datetime( $bstrDateTime );

$diff_h = sprintf $diff->in_units('hours');
$diff_m = sprintf $diff->in_units('minutes');
$diff_s = sprintf $diff->in_units('seconds');

$difference = $diff_h.":".$diff_m.":".$diff_s;
print $difference;

但是我的错误差异很大。

输出是:1:90:48

我做错了什么?而不是90,它应该是30。

2 个答案:

答案 0 :(得分:1)

您目前正在使用in_units,但它没有达到预期效果。因为它具有不同的功能,因为它计算指定单位中给定对象之间的差异。只要它们是转换兼容的。有关此参考的更多信息,请参阅 - DateTime::DurationStackOverflow

现在,提供所需输出的正确代码如下:

my $bstr = '02/07/17 09:25:22';
my $betr = '02/07/17 10:55:48';
my $bstrDateTime = DateTime->from_epoch(epoch => str2time($bstr));
my $betrDateTime = DateTime->from_epoch(epoch => str2time($betr));

my $diff = $betrDateTime->subtract_datetime( $bstrDateTime ); 

my $diff_h = $diff->hours;
my $diff_m = $diff->minutes;
my $diff_s = $diff->seconds;

my $difference = $diff_h.":".$diff_m.":".$diff_s;
print $difference;

此外,您应该在发布的代码中将时间戳放在引号内,并且在前几行中也会丢失分号。请记住运行您粘贴的代码以避免这些错误。

答案 1 :(得分:1)

如果您向我们提供实际编译的代码,这会有所帮助,因此我们不必花时间修复丢失的分号和引号。

使用str2time()并从纪元创建DateTime对象有点浪费。最好使用DateTime::Format::Strptime直接将字符串解析为DateTime对象。

在DateTime :: Duration(而非hours())上使用minutes()seconds()in_units()方法将为您提供所需的结果。

use strict;
use warnings;

use DateTime::Format::Strptime;

my $date_parser = DateTime::Format::Strptime->new(
  pattern => '%d/%m/%y %H:%M:%S',
);

my $bstr = '02/07/17 09:25:22';
my $betr = '02/07/17 10:55:48';
my $bstrDateTime = $date_parser->parse_datetime( $bstr );
my $betrDateTime = $date_parser->parse_datetime( $betr );
my $diff = $betrDateTime->subtract_datetime( $bstrDateTime );

print $diff->hours, ', ', $diff->minutes, ', ', $diff->seconds, "\n";