如何使用Perl进行日期时间比较并计算增量?

时间:2009-10-12 15:02:22

标签: perl timestamp date

我从人类可读文本中提取了年,月,日,小时,分钟,秒和毫秒数据(它不是时间戳格式,而是类似于“X从HH开始:MM:SS.SSS on DD MMM YYYY并以HH:MM:SS.SSSS结束于DD MMM YYYY“)结束,因此对于每个记录的事件,我都有每个值。

但是,我需要将它们变成某种时间戳,这样我才能对它进行数学运算 - 我想确定事件持续多长时间(结束时间 - 开始时间)。我希望time函数可以获取参数,这样我就可以创建两个任意time s,但情况似乎并非如此。

如果可能的话,我想坚持我可以添加到项目中的核心Perl库或脚本中可用的功能,因为在目标机器上安装CPAN模块会让每个人都头疼,如果它是均匀的话可以让模块通过安全限制。

5 个答案:

答案 0 :(得分:7)

您想要CPAN模块DateTimeHere's介绍。

在Debian GNU / Linux或Ubuntu系统上,只需运行:

apt-get install libdatetime-perl

安装模块。

答案 1 :(得分:3)

您可以使用Time:Local执行此操作。它基本上与内置的“localtime”功能相反,因此您可以从标准日期生成时间戳。

答案 2 :(得分:2)

就内置插件而言,这些可能会有所帮助:

  1. POSIX(适用于mktimestrftime
  2. Time::PieceTime::LocalTime::Seconds。这些都是Perl 5.10中的标准,但在早期系统上默认可能不可用。
  3. 也就是说,时间/日期计算复杂。如果唯一的障碍是安装模块的一些头痛(而不是禁止它们的公司政策),我真的建议看CPAN。

    修改:我从您对其他帖子的评论中看到 公司限制。您应该更新原始帖子,因为“头痛”和“安全限制”之间存在很大差异。无论如何,DateTimeDate::Manip值得关注。即使你没有安装它们,你也可以从阅读它们的源头中获得很多。

答案 3 :(得分:2)

如果您只对比较时间感兴趣,

my $ts1 = sprintf( '%4.4d%2.2d%2.2d%2.2d%2.2d%3.3d', 
                   $year1, $month1, $mday1, $hour1, $min1, $sec1, $ms1 );

my $ts2 = sprintf( '%4.4d%2.2d%2.2d%2.2d%2.2d%3.3d', 
                   $year2, $month2, $mday2, $hour2, $min2, $sec2, $ms2 );

使用cmp就足够了。

要对这些时间进行算术运算,请使用Time::Local获取自纪元以来的秒数,然后将$ms1/1000添加到该值。

my $time1 = timelocal($sec1, $min1, $hour1, $mday1, $mon1, $year1) + $ms1/1000;

答案 4 :(得分:1)

您可以使用POSIX::mktime将分解时间转换为时间戳。请注意,月份为0,年份为1900,因此请进行相应调整。 : - )

use POSIX qw(mktime);
$timestamp = mktime($sec, $min, $hour, $day, $month - 1, $year - 1900);