坦率地说,我根本不懂Perl。出于某些原因,我必须使用perl来解决问题。我试着寻找快速解决方案而找不到任何(我的坏)
问题:我有一个包含文件名列表和时间戳(即2012-05-24T18:19:35.000Z
)的文件。
我需要解析确定哪些更多是90天之久。
我只需要检查,其他一切我认为我已经到位了。当我用谷歌搜索时,有些人建议使用一些花哨的日期时间包,而一些建议是围绕使用-M。
实际上很混乱。所有帮助赞赏。感谢。答案 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