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";
}
...
}
}