Regex 比较以字符串形式存储的日期

Regex 比较以字符串形式存储的日期,regex,perl,datetime,Regex,Perl,Datetime,我有两个日期(连同日期和时间)以以下格式书写: Mon Aug 12 17:32:39 PDT 2013 这是我的本地时间,另一个时间存储在散列中。我需要使用所有可能的日期和时间比较,将这个时间与散列存储的时间进行比较 这就是我得到的 #!/usr/bin/perl use DateTime; open(FH,'log.txt'); my %stat; my ($qbsid, $exittime, $exittimeval); while ($line = <FH>) {

我有两个日期(连同日期和时间)以以下格式书写:

Mon Aug 12 17:32:39 PDT 2013
这是我的本地时间,另一个时间存储在散列中。我需要使用所有可能的日期和时间比较,将这个时间与散列存储的时间进行比较

这就是我得到的

#!/usr/bin/perl

use DateTime;
open(FH,'log.txt');

my %stat;

my ($qbsid, $exittime, $exittimeval);
while ($line = <FH>) {
        if ($line =~ /Exit time/) {
        ($exittime, $exittimeval) = split(': ',$line);
         $stat{$qbsid} = {
            time     => $exittimeval
            };
    }
}

my $local_time = localtime time;
foreach my $qbsid (keys %stat){
    my $cmd = $stat{$qbsid}->{time};
    my $cmp = DateTime->compare($cmd,$datetime);
    print "$cmp\n";
    }
谢谢您的时间。

您应该看看。该模块提供用于比较日期的实用程序。Regex在这里是错误的方法。

我将推荐。这似乎不是很多人最喜欢的时间模块,但它附带了Perl,这意味着您不必安装它。我怀疑它将成为标准的时间模块,你也可以学习如何使用它。早期版本的
Time::Piece
与朱利安日期有关,但最新版本解决了这一问题(将在下一个Perl版本中发布)

如果不知道您的日志是什么样子,以及您正在尝试做什么,那么就有点难以帮助您编写代码。例如,使用未设置的
$qbsid
对哈希进行哈希。您需要使用
使用strict
使用警告在您的程序中。这会发现这个错误。如果在第二个循环之前声明
$local\u time
,但在该循环中使用
$datetime
,它也会捕获到错误

另外,
split
不使用字符串,而是使用正则表达式模式作为第一个参数

您还需要在
while
语句之后执行
chomp$line
。否则,
$line
将以一个不可见的NL字符结尾,这可能会导致各种问题

现在,你到底想储存什么?看起来您的内部哈希存储为当前时间作为键,您的
$exittimeval
作为值

我会使用epoch time(1970年1月1日以来的秒数)作为键,使用
time::Piece
对象作为数据:

($exittime, $exittimeval) = split /:\s+/, $line);
my $exit_time_obj = Time::Piece->strptime( $exittimeval, "%a %b %d %H:%M:%S %Z %Y");
my $time_obj = Time::Piece->new(time);
$stat{$qbsid} = {$time_obj->epoch => $exit_time_obj};
现在,您可以通过将键更改为Time::Piece对象并执行所需的任何比较来进行比较

顺便说一句,还有一个问题:
时间
在变化!如果您按时间为子哈希设置关键帧,那么当您到达第二个循环时,子哈希将有所不同。您需要使用第二个循环来获取这些实际关键点

my $local_time = Time::Piece->new(time);
foreach my $qbsid (keys %stat) {
    for my $key_time ( keys %{ $stat{$qbsid} } )( 
        my $cmd = $stat{$qbsid}->{$key_time}; # Already a Time::Piece object
        if ( $local_time->year eq $cmd->year ) {
           print "Years match: " . $cmd->year . "\n";
        }
        if ( $local_time->month eq $cmd->month ) {
           print "Months match: " . $cmd->Month . "\n";
        }
        ...
    }
}
不幸的是,这是非常不完整的,因为我不知道你真正想做什么

  • 你的
    log.txt
    看起来像什么
  • log.txt
    中的不同字段是什么
  • 你想用'log.txt'做什么
  • 您希望您的计划产生什么结果

我不可能知道如何指导你。

始终使用
严格使用;使用警告!这些不是您传递给
compare
@ikegami的DateTime对象,您可以使用任何好的模块来解决上述问题。我混淆了Date::Calc、Datemine和Time::Parse。等待你的建议。谢谢,我用DateTime。你为什么要看其他模块?
my $local_time = Time::Piece->new(time);
foreach my $qbsid (keys %stat) {
    for my $key_time ( keys %{ $stat{$qbsid} } )( 
        my $cmd = $stat{$qbsid}->{$key_time}; # Already a Time::Piece object
        if ( $local_time->year eq $cmd->year ) {
           print "Years match: " . $cmd->year . "\n";
        }
        if ( $local_time->month eq $cmd->month ) {
           print "Months match: " . $cmd->Month . "\n";
        }
        ...
    }
}