我正在使用perl来访问我从DD-MON-YYYY格式获取日期的数据库。我需要执行2次操作:
将此日期与两个日期进行比较,看它是否位于该时间范围内。
my $ chdate = '15 -Feb-2013';
sub get_stats {
my %map = ( 'Jan' => '01', 'Feb' => '02', 'Mar' => '03', 'Apr' => '04',
'May' => '05', 'Jun' => '06', 'Jul' => '07', 'Aug' => '08',
'Sep' => '09', 'Oct' => '10', 'Nov' => '11', 'Dec' => '12');
$chdate =~ s/(..)-(...)-(....)/$map{$2}\/$1\/$3/;
print "New date: $chdate";
}
如何执行(2)操作?
我有一个旧版本的Perl(没有Time :: Piece模块),我没有权限更新:)
答案 0 :(得分:5)
我建议你使用Time::Piece
模块。它是Perl5 v9.5以来的核心模块,因此可能不需要安装。
只需使用strptime
解码日期,然后使用strftime
重新编码。
use strict;
use warnings;
use Time::Piece;
my $date = '28-jul-1986';
print Time::Piece->strptime($date, '%d-%b-%Y')->strftime('%m/%d/%Y');
<强>输出强>
07/28/1986
答案 1 :(得分:1)
如果您将日期转换为Time::Piece对象,则可以使用标准数字比较运算符对它们进行比较。所以你可以这样做。
#!/usr/bin/perl
use strict;
use warnings;
use 5.010;
use Time::Piece;
my $start_date_str = '1-mar-2013';
my $end_date_str = '31-mar-2013';
my $date_to_test_str = '4-mar-2013';
my $in_fmt = '%d-%b-%Y';
my $out_fmt = '%m/%d/%y'; # Warning: Illogical format!
my $start_date_tp = Time::Piece->strptime(
$start_date_str, $in_fmt
);
my $end_date_tp = Time::Piece->strptime(
$end_date_str, $in_fmt
);
my $date_to_test_tp = Time::Piece->strptime(
$date_to_test_str, $in_fmt
);
print $date_to_test_tp->strftime($out_fmt), ' is ';
unless ($start_date_tp <= $date_to_test_tp and
$date_to_test_tp <= $end_date_tp) {
print ' not ';
}
say 'between the two test dates';
答案 2 :(得分:-2)
对于(2)你可以这样做:
sub dateAsNumber # Arg mm/dd/yyyy - Converts to a number to be compared
{
$_[0]=~m%(\d\d)/(\d\d)/(\d\d\d\d)%;
return (($3 * 400 + $1) * 40 + $2);
}
$test = &dateAsNumber($testDateAsString);
if (&dateAsNumber($startDateAsString) < $test &&
&dateAsNumber($endDateAsString) > $test)
{
print "$test date is between $startDateAsString and $endDateAsString\n";
}
else
{
print "$test date is NOT between $startDateAsString and $endDateAsString\n";
}