perl中的日期转换

时间:2013-03-04 11:54:13

标签: perl perl-module

我正在使用perl来访问我从DD-MON-YYYY格式获取日期的数据库。我需要执行2次操作:

  1. 将此格式转换为MM / DD / 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";
    

    }

  3. 如何执行(2)操作?

    我有一个旧版本的Perl(没有Time :: Piece模块),我没有权限更新:)

3 个答案:

答案 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";
}