如何在Perl中计算两个时间戳字符串之间的差异

6
我搜索了所有可能的问题,但找不到答案,所以Perl专家能帮我解决这个问题吗?
我有两个时间戳,像“05/25/2011 05:22:03 PM”和“05/25/2011 05:34:08 PM”。它们以字符串形式存储。
my $str1 = '05/25/2011 05:22:03';
my $str2 = '05/25/2011 05:34:08';

后者指工作结束的时间,前者指其开始的时间。

如何计算日期和时间之间的差异?在这种情况下,日期相同,但它们也可能不同。


你想要什么样的结果?想要秒数差吗? - ysth
1
在示例中没有展示,真的有产品经理吗? - ysth
嗨Ysth,我希望显示差异为12分钟和5秒。 - skyrocker
2个回答

11

我建议您使用Time::Piece模块。自Perl 5版本9.5发布以来,它已成为核心模块,所以不需要安装。

这段代码演示了......

use strict;
use warnings;

use Time::Piece;

my $str1 = 'Execution started at 05/25/2011 05:22:03 PM';
my $str2 = 'Execution completed at 05/25/2011 05:34:08 PM';

my @times = map Time::Piece->strptime(/(\d.+M)/, '%m/%d/%Y %H:%M:%S %p'), $str1, $str2;

my $delta = $times[1] - $times[0];
print $delta->pretty;

输出

12 minutes, 5 seconds

谢谢Borodin的回答,但是它报错了,显示在/usr/lib/perl/5.14/Time/Piece.pm的第469行解析时间时出错。 - skyrocker
如果你的日期/时间实际上看起来像 05/25/2011 05:34:08 PM,那么你需要使用格式 %m/%d/%Y %H:%M:%S %p - Borodin
你的代码现在运行得很好,实际上我有这些行“Execution completed at 05/25/2011 05:34:08 PM”和“Execution started at 05/25/2011 05:22:03 PM”,并且使用这个正则表达式($mon1,$date1,$year1,$hr1,$min1,$sec1) = ($firstline =~ m/(\d+)/(\d+)/(\d+) (\d+):(\d+):(\d+)/); 我只获取了数字值,然后添加斜杠(/)和分号,并将它们存储到一个字符串中以使其成为时间戳。但这通常会导致问题,你能告诉我应该使用什么正则表达式来仅获取那些行的时间戳值吗?我真的很感激。谢谢Borodin。 - skyrocker
那么我的意思是,应该使用什么正则表达式直接从行“Execution completed at 05/25/2011 05:34:08 PM”中获取仅为“05/25/2011 05:22:03”的值。 - skyrocker
嗨Borodin,它仍然抛出相同的错误。看起来时间戳没有被正确保存,因为我是从文件中读取的。仍在努力弄清楚。但我非常感谢您的帮助和回复。你真棒 :) - skyrocker
显示剩余3条评论

3
你可以利用DateTime及其subtract_datetime()方法,该方法返回一个DateTime::Duration对象。
use Date::Parse;
use DateTime;

my $t1 = '05/25/2011 05:22:03';
my $t2 = '05/25/2011 05:34:08';

my $t1DateTime = DateTime->from_epoch( epoch => str2time( $t1 ) );
my $t2DateTime = DateTime->from_epoch( epoch => str2time( $t2 ) );

my $diff = $t2DateTime->subtract_datetime( $t1DateTime );

print "Diff in minutes: " . $diff->in_units('minutes') . "\n";
print "Diff in hours: " . $diff->in_units('hours') . "\n";
print "Diff in months: " . $diff->in_units('months') . "\n";

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接