如何比较perl中的字符串日期时间?

qui*_*kxi 5 perl

我在字符串"11:56:41,11/22/2011"中有这个日期时间格式.

这就是我想要的:

比较两个日期时间字符串,如.

$date1 = "11:56:41, 11/22/2011";
$date2 = "11:20:41, 11/20/2011";
if($date2 < $date1) {
    do something...
} else {
    do nothing...
}
Run Code Online (Sandbox Code Playgroud)

任何想法我怎么能在perl中实现这一点?

ste*_*enl 13

在将时间转换为Time::Piece对象后使用重载比较的另一种解决方案.创建对象可能对于简单的事情来说是过度的,但如果您需要与时间做其他事情,它们会变得非常有用.

use Time::Piece;

my $dateformat = "%H:%M:%S, %m/%d/%Y";

my $date1 = "11:56:41, 11/22/2011";
my $date2 = "11:20:41, 11/20/2011";

$date1 = Time::Piece->strptime($date1, $dateformat);
$date2 = Time::Piece->strptime($date2, $dateformat);

if ($date2 < $date1) {
    do something...
} else {
    do nothing...
}
Run Code Online (Sandbox Code Playgroud)


ike*_*ami 11

一种有效的方法是将字段重新排序为词法上可比较的字符.

sub to_comparable {
   my ($date) = @_;
   my ($H,$M,$S,$d,$m,$Y) = $date =~ m{^([0-9]{2}):([0-9]{2}):([0-9]{2}), ([0-9]{2})/([0-9]{2})/([0-9]{4})\z}
      or die;
   return "$Y$m$d$H$M$S";
}

if (to_comparable($date2) lt to_comparable($date1)) {
   ...
} else {
   ...
}
Run Code Online (Sandbox Code Playgroud)

  • 由于我们不知道单个数字的日/月/小时/分钟是否为零填充,因此返回sprintf可能更好('%04d%02d%02d%02d%02d $ 02d',$ Y ,$ M,$ d,$ H,$ M,$ S) (3认同)

dax*_*xim 5

什么,已经4小时而不是单一的DateTime(所有人都欢呼强大的DateTime)回答了什么?你是懒散的,用户......☻

use DateTime::Format::Strptime qw();
my $p = DateTime::Format::Strptime->new(pattern => '%T, %D', on_error => 'croak',);

my $date1 = $p->parse_datetime('11:56:41, 11/22/2011');
my $date2 = $p->parse_datetime('11:20:41, 11/20/2011');

if($date2 < $date1) {
    say "$date2 comes before $date1";
} else {
    say "$date2 does not come before $date1";
}
Run Code Online (Sandbox Code Playgroud)

该方法parse_datetime返回DateTime其比较运算符和字符串化重载到DTRT的实例.