从Perl的时间戳中查找以天为单位的年龄

时间:2012-05-24 19:15:58

标签: perl datetime

坦率地说,我根本不懂Perl。出于某些原因,我必须使用perl来解决问题。我试着寻找快速解决方案而找不到任何(我的坏)

问题:我有一个包含文件名列表和时间戳(即2012-05-24T18:19:35.000Z)的文件。 我需要解析确定哪些更多是90天之久。

我只需要检查,其他一切我认为我已经到位了。当我用谷歌搜索时,有些人建议使用一些花哨的日期时间包,而一些建议是围绕使用-M。

实际上很混乱。所有帮助赞赏。感谢。

4 个答案:

答案 0 :(得分:4)

此格式由RFC3339(相当具体)和ISO8601(以及许多其他)定义。

use strict;
use warnings;
use feature qw( say );

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

my $limit_dt = DateTime->now->subtract( days => 90 );

my $format = DateTime::Format::RFC3339->new();
while (<>) {
   chomp;
   my ($timestamp, $filename) = split(' ', $_, 2);
   my $dt = $format->parse_datetime($timestamp);
   say($filename) if $dt < $limit_dt;
}

例如,

$ cat data
2012-05-24T18:19:35.000Z new
2012-02-25T18:19:35.000Z old
2012-02-24T18:19:35.000Z ancient

$ perl script.pl data
ancient

要忽略时间部分,只检查日期部分是否超过90天,请改用以下内容:

my $limit_dt = DateTime->today( time_zone => 'local' )->subtract( days => 90 );

答案 1 :(得分:3)

这种日期格式的优点是,在这两个字符串之间进行字典比较(几乎)与进行日期时间比较相同。因此,您只需要将过去90天的日期转换为该格式,并进行字符串比较。

use POSIX 'strftime';
$_90_days_ago = strftime("%FT%T.000Z", gmtime( time-90*86400 ));

...
foreach $date (@your_list_of_dates) {
    if ($date lt $_90_days_ago) {
        print "$date was at least 90 days ago.\n";
    } else {
        print "$date is less than 90 days ago.\n";
    }
}

答案 2 :(得分:0)

这样的事情应该有效:

#! perl -w

use strict;
use Time::Local;

# 90 times 24 hours of 60 minutes, 60 seconds
my $ninety_days = 24 * 60 * 60 * 90;
my $now = time;

# parse the time stamps in the file
while (<INPUTFILE>)
{
    chomp();

    if (/(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})/)
    {
        my $year = $1;
        my $month = $2;
        my $day = $3;
        my $hour = $4;
        my $minute = $5;
        my $second = $6;

        # Looks like these are in GMT ("Z") so we'll use timegm
        my $time = timegm($second,$minute,$hour,$day,$month - 1,$year - 1900);

        if (($now - $time) > $ninety_days)
        {
            print "$_ is more than 90 days ago!
        }
    }
}

(这只是基本的 - 它需要有关打开数据文件的详细信息等)

答案 3 :(得分:-1)

您应该查看此Perl模块https://metacpan.org/pod/Date::Manip