Perl日期比较不起作用

时间:2017-06-02 08:37:37

标签: perl date time comparison

我正在尝试在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

有什么想法吗?

2 个答案:

答案 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;
  • 调整时间
  • 只需在'UTC'工作 - 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