我有两个日期(连同日期和时间),以便它们采用以下格式:
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";
}
请建议我这样做。
哈希以与上面相同的格式打印日期:
Mon Aug 10 14:31:49 PDT 2013
感谢您的时间。
答案 0 :(得分:0)
你应该看看Date::Calc。该模块提供了比较日期的实用程序。正则表达式是错误的方法。
答案 1 :(得分:0)
我将推荐Time::Piece。这似乎不是太多人最喜欢的时间模块,但它带有Perl,这意味着你不必安装它。我怀疑它将成为标准时间模块,你也可以学习如何使用它。早期版本的Time::Piece
存在Julian日期问题,但最新版本解决了这个问题(并将在下一个Perl版本中发布)。
不知道你的日志是什么样的,以及你想要做什么,这对你的编码有所帮助。例如,您使用未设置的$qbsid
哈希哈希。您需要在程序中使用use strict;
和use warnings;
。这会发现这个错误。如果在第二个循环之前声明$local_time
,但在该循环中使用$datetime
,它也会发现错误。
此外,split
不接受字符串,而是使用正则表达式作为第一个参数。
您还需要在chomp $line
声明后立即执行while
。否则,您的$line
将以隐藏的NL字符结束,这可能会导致各种问题。
现在,你究竟想要存储什么?看起来您的内部哈希值被存储为当前时间作为键,而$exittimeval
作为值。
我会使用纪元时间(自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对象并执行您想要的比较来进行比较。
顺便说一句,另一个问题是:time
一直在变化!如果你按时间键入你的子哈希,那么当你进入第二个循环时它会有所不同。您需要使用第二个循环来获取这些实际的密钥。
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
中有哪些不同的字段?我不可能知道如何引导你。