我正在尝试在Perl中进行一些日期比较,但似乎它没有按预期工作。我可能做错了什么?
my $lCurrentTime = Time::Piece->new;
my $l15MinsAGo = $lCurrentTime - 900;
my $lEffDate = Time::Piece->strptime($opt_effdate, '%d-%m-%Y %H:%M:%S');
print("\n lCurrentTime = $lCurrentTime l15MinsAGo = $l15MinsAGo lEffDate = $lEffDate\n");
if ($lEffDate < $lCurrentTime) {
print("Eff date $lEffDate is smaller than 15 mins ago $l15MinsAGo\n");
} elsif ($lEffDate >= $lCurrentTime) {
print("Eff date $lEffDate is larger than 15 mins ago $l15MinsAGo\n");
}
打印:
lCurrentTime = Fri Jun 2 10:32:53 2017
l15MinsAGo = Fri Jun 2 10:17:53 2017
lEffDate = Fri Jun 2 10:07:00 2017
Eff date Fri Jun 2 10:07:00 2017 is larger than 15 mins ago Fri Jun 2 10:17:53 2017
有什么想法吗?
答案 0 :(得分:2)
你在哪个时区?
这可能会启发你发生了什么:
print $lEffDate -> epoch,"\n";
print $lCurrentTime -> epoch,"\n";
print $lEffDate -> tzoffset,"\n";
print $lCurrentTime -> tzoffset,"\n";
我怀疑(像我一样)strptime
日期是零偏移,而new
得到的日期是你的时区。
因此实际时间戳有几个小时不同。
要纠正这个问题 - 有几种不同的方法:
%Z
或%z
将时区解析为字符串。 $time += $time->localtime->tzoffset;
strptime
即可。所以你可以改为$lCurrentTime = gmtime;
我想。 答案 1 :(得分:2)
这里有几个问题:
测试lEffDate < $lCurrentTime
应为lEffDate < $l15MinsAGo
您正在创建没有时区的$lEffDate
,而$lCurrentTime
是使用本地时区创建的,夏令时是当前有效的,因此to绑定不同
另外
Time::Piece
导出localtime
,它会覆盖内置运算符。它的功能与原始调用和Time::Piece
对象相同,具体取决于它的使用方式
请勿使用hungarianNotationAndCamelCase
。它的可读性不高,特别适合那些第一语言不是英语的人。经验丰富的Perl开发人员大多使用snake_case
,而您的领先l
可能意味着&#34; longword&#34;,这与Perl无关
您可以通过strptime
上的$lCurrentTime
而不是类名Time::Piece
喜欢这个
use strict;
use warnings 'all';
use Time::Piece;
use Time::Seconds 'ONE_MINUTE';
my $opt_eff_date = '02-06-2017 10:00:00';
my $now = localtime;
my $past_15mins = $now - 15 * ONE_MINUTE;
my $eff_date = $now->strptime( $opt_eff_date, '%d-%m-%Y %H:%M:%S' );
print <<END;
now = $now
past_15mins = $past_15mins
eff_date = $eff_date
END
if ( $eff_date < $past_15mins ) {
print "Effective date $eff_date is smaller than 15 mins ago $past_15mins\n";
}
else {
print "Effective date $eff_date is larger than 15 mins ago $past_15mins\n";
}
now = Fri Jun 2 10:36:26 2017
past_15mins = Fri Jun 2 10:21:26 2017
eff_date = Fri Jun 2 10:00:00 2017
Eff date Fri Jun 2 10:00:00 2017 is smaller than 15 mins ago Fri Jun 2 10:21:26 2017