我设法拼凑了一个脚本,该脚本读取了数千个日志条目并创建了它们的摘要。到目前为止都很好。我还希望能够创建一个单独的最近90天的条目摘要。
日志中的单个条目如下所示,新条目总是被添加到文件的底部:
序列号:10123407
日期:15/08/15
时间:12:58
循环类型:134 U
保持时间:0180
周期号:1357
干燥时间:00分钟。循环开始
12:58.35保持时间0000秒 周期:失败 User_Message 13
参考用户手册循环结束
13:01.32
我用来返回90天前的当前日期和日期的代码是:
use POSIX qw(strftime);
use Time::Local qw(timegm);
my ($d,$m,$y) = (localtime())[3,4,5];
print OUT (strftime("%d/%m/%y - ", gmtime(timegm(0,0,0,$d,$m,$y)-90*24*60*60)));
print OUT (strftime("%d/%m/%y\n", gmtime(timegm(0,0,0,$d,$m,$y))));
我这样做是因为它以我想要的格式生成我的日期,与日志dd / mm / yy相同,并且始终为零填充。
使用这个我得到以下输出:
11/05/15 - 09/08/15
因此,如果我可以打印它,我如何将数据存储为变量:$day90
,$month90
,$year90
,$day
,$month
和$year
。如果我可以这样做,那么我认为我可以进行必要的逻辑操作来确定日志条目是否在过去90天内,然后根据需要创建我的摘要。
对于如何做到这一点,我没有任何先入为主的想法,因此非常感谢任何和所有解决方案。
答案 0 :(得分:3)
比较日期的最佳方法之一是将它们转换为%Y%m%d
格式(如果您想要更具可读性,则为%Y-%m-%d
),然后您可以将它们作为文本字符串进行比较
您可以使用核心模块Time::Piece
为您进行格式化
这是一个例子。它将输入格式和比较格式分别定义为$dmy_format
和$ymd_format
今天的日期和90天前的字符串定义并在第一次调用state
时存储为in_range
个变量,因此永远不需要再次计算。 (对于state
关键字,您需要Perl 5版本10或更高版本。如果该版本不可用,则只需使用my
并将这些定义移到和< em>紧接在子程序之前)
传递的参数是DD/MM/YY
格式的日期。它被解析并重新格式化为YYYY-MM-DD
,子例程返回将其与两个边界日期进行比较的结果
use strict;
use warnings;
use v5.10; # for 'state' variables
use Time::Piece;
use Time::Seconds 'ONE_DAY';
for my $month ( 1 .. 12 ) {
my $date = sprintf '14/%02d/15', $month;
printf "date %s is %s\n", $date, in_range($date) ? 'in range' : 'out of range';
}
sub in_range {
state $ymd_format = '%Y-%m-%d';
state $dmy_format = '%d/%m/%y';
state $now = localtime;
state $today = $now->strftime($ymd_format);
state $days90 = ($now - 90 * ONE_DAY)->strftime($ymd_format);
my $date = Time::Piece->strptime(shift, $dmy_format)->strftime($ymd_format);
$date le $today and $date ge $days90;
}
date 14/01/15 is out of range
date 14/02/15 is out of range
date 14/03/15 is out of range
date 14/04/15 is out of range
date 14/05/15 is in range
date 14/06/15 is in range
date 14/07/15 is in range
date 14/08/15 is out of range
date 14/09/15 is out of range
date 14/10/15 is out of range
date 14/11/15 is out of range
date 14/12/15 is out of range
答案 1 :(得分:0)
您可以使用此方法将日期变为变量,即与/
分开并将其存储在变量中:
use strict;
use warnings;
use POSIX qw(strftime);
use Time::Local qw(timegm);
my ($d,$m,$y) = (localtime())[3,4,5];
my ($day90,$month90,$year90) = split(/\//,(strftime("%d/%m/%y", gmtime(timegm(0,0,0,$d,$m,$y)-90*24*60*60))));
my ($day,$month,$year)=split(/\//,(strftime("%d/%m/%y", gmtime(timegm(0,0,0,$d,$m,$y)))));
print "DATE(BEFORE 90 days): $day90 $month90 $year90 \n";
print "DATE(CURRENT): $day $month $year \n";
<强>输出:强>
DATE(BEFORE 90 days): 11 05 15
DATE(CURRENT): 09 08 15