我有两个日期时间字符串:
$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。
答案 0 :(得分:1)
您目前正在使用in_units,但它没有达到预期效果。因为它具有不同的功能,因为它计算指定单位中给定对象之间的差异。只要它们是转换兼容的。有关此参考的更多信息,请参阅 - DateTime::Duration或StackOverflow。
现在,提供所需输出的正确代码如下:
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";