Perl:设置$ day,$ month和$ year

时间:2015-08-09 12:00:23

标签: perl date

我设法拼凑了一个脚本,该脚本读取了数千个日志条目并创建了它们的摘要。到目前为止都很好。我还希望能够创建一个单独的最近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天内,然后根据需要创建我的摘要。

对于如何做到这一点,我没有任何先入为主的想法,因此非常感谢任何和所有解决方案。

2 个答案:

答案 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