Perl比较日期,在数据库中定义为字符串

时间:2014-12-23 16:47:27

标签: perl

我认为这是一个非常基本的问题。 但我尝试了各种各样的方法,但无法解决这个问题。

我有一个字符串值" 21-01-2014"。我必须检查此日期是否大于2014年9月1日。

我该怎么做?

我使用了Parse Date。 例如

if ( ParseDate( $row->{Date} ) >= ParseDate("01-09-2014") ){
}

但是这没用。 可能这里有一个错误?

有人可以建议一种更简单直接的方法。 $ row->日期来自数据库,定义为varchar。

感谢。

1 个答案:

答案 0 :(得分:2)

ParseDate来自哪里?是Time::ParseDate吗?

我更喜欢Time::Piece。它从5.10开始就是标准的Perl模块,我可以指定日期所在的格式。另外,Time::Piece是面向对象的:

use strict;             # Lets you know when you misspell variable names
use warnings;           # Warns of issues (using undefined variables
use feature qw(say);

use Time::Piece;

my $time1 = "21-01-2014";
my $time2 = "01-09-2014";   #Assuming this is Sept, 1, 2014

my $time_obj1 = Time::Piece->strptime("$time1", "%d-%m-%Y");
my $time_obj2 = Time::Piece->strptime("$time2", "%d-%m-%Y");

if ( $time_obj1 < $time_obj2 ) {  # Comparing number of days since "the epoc"
    say $time_obj1->dmy . " is older than " . $time_obj2->dmy;
}
else {
    say $time_obj2->dmy . " is older than " . $time_obj1->dmy;
}

如果您不想创建对象,则只需使用Time::Piece->strptime返回的值:

if ( Time::Piece->strptime("$time1", "%d-%m-%Y")
        < Time::Piece->strptime("$time2", "%d-%m-%Y") ) {
    say "$time1 is older than $time2";
}
else {
    say "$time2 is older than $time1";
}

字符串%d-%m-%Y是您日期的格式。 (并且你应该检查Time::Piece->strptime的返回值,以确保你得到一个有效的Time::Piece对象。为了简单起见,我没有这样做。

您可以在date的联机帮助页或strftime的联机帮助页中找到日期的百分比格式代码