坦率地说,我根本不了解 Perl。由于某些原因,我必须使用 perl 解决问题。我尝试寻找快速解决方案,但找不到任何(我的错)
问题:我有一个文件,其中包含文件名列表和时间戳(即2012-05-24T18:19:35.000Z
)。我需要解析确定其中哪些超过 90 天。
我只需要检查,我认为我已经准备好其他一切。当我用谷歌搜索时,一些人建议使用一些花哨的日期时间包,而一些建议是围绕使用 -M 的。
其实很迷茫。所有帮助表示赞赏。谢谢。
此格式由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 );
该日期格式的优点是在其中两个字符串之间进行字典比较与进行日期时间比较(几乎)相同。因此,您只需将过去 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";
}
}
像这样的东西应该工作:
#! 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!
}
}
}
(这只是基本的 - 它需要有关打开数据文件等的详细信息)
你应该看看这个 Perl 模块https://metacpan.org/pod/Date::Manip