使用Perl,如何以YYYY-MM-DD的形式比较日期?

Bdf*_*dfy 10 perl

我有一个数组的n字符串格式为YYYY-MM-DD(例如,"2010-10-31").

如何将日期与此数组中的字符串进行比较?

例如,超过30天前删除字符串?

Dav*_*man 14

关于伟大的事情YYYY-MM-DD-格式化日期是,你可以使用简单的字符串比较比较.在Perl中,这就是ltgt运营商.

在这种情况下,听起来你只是想检查数组中的日期是早于还是晚于给定的目标日期(恰好是"30天前").对于这种情况,我将采用的方法是首先确定30天前的日期,然后将其作为字符串与数组中的每个日期进行比较.我不会介绍将所有YYYY-MM-DD字符串转换为"正确的"日期对象,纪元时间等的开销,而只是为了测试代表较早的日期.

#!/usr/bin/env perl

use strict;
use warnings;

my $thirty_days = 30 * 24 * 60 * 60;
my ($old_day, $old_month, $old_year) = (localtime(time - $thirty_days))[3..5];
my $cutoff = sprintf('%04d-%02d-%02d', 
                     $old_year + 1900, $old_month + 1, $old_day);

my @dates = ('2010-10-12', '2010-09-12', '2010-08-12', '2010-09-13');
for my $date (@dates) {
  print "$date\n" if $date gt $cutoff;
} 
Run Code Online (Sandbox Code Playgroud)

  • 令我感到惊讶的是,有这么多人跳到这种复杂的膝盖反射解决方案.我们在_Effective Perl Programming_中只有这个解决方案.:) (2认同)
  • 好吧,不要忘记可以绊倒所有日期模块的所有其他错误来源.在大多数情况下,您提到的错误来源很容易修复或发现,并且在以编程方式生成时非常罕见.即使有一个像闰年那样的异常值日期,也没有Date模块可以为你神奇地解决它. (2认同)

Øyv*_*aar 8

猜猜有多种方法可以做到,但我喜欢Date :: Simple这样的东西..

来自文档的一个例子:

use Date::Simple ('date', 'today');

# Difference in days between two dates:
$diff = date('2001-08-27') - date('1977-10-05');

# Offset $n days from now:
$date = today() + $n;
print "$date\n";  # uses ISO 8601 format (YYYY-MM-DD)
Run Code Online (Sandbox Code Playgroud)

这对于对象++进行算术很有用.

但是只有日期,没有小时,分钟或秒


Ped*_*lva 5

use strict; use warnings;
use DateTime ();
use DateTime::Duration ();
use DateTime::Format::Natural ();

my $parser = DateTime::Format::Natural->new;
my $now    = DateTime->now;
my $delta  = DateTime::Duration->new( days => 30 );
my $cutoff = $now->subtract_duration( $delta );

my @new_dates = map  { $_->[1] }
                grep { -1 == $_->[0] }
                map  { 
                    chomp;
                    [
                        DateTime->compare(
                            $parser->parse_datetime( $_ ),
                            $cutoff
                        ),
                        $_ 
                    ]
                } <DATA>;

print "@new_dates";

__DATA__
2010-07-31
2010-08-31
2010-09-30
2010-10-31
Run Code Online (Sandbox Code Playgroud)

  • 这可能是对程序性能的一个巨大的,不必要的消耗.一旦你构建了(单个)截止日期,日期就很容易在列表上进行比较. (3认同)
  • lexigraphically排序不是一个黑客.故障模式也存在于Date模块中.尽管您的解决方案最终会产生正确的输出,但我一直处于无法及时生成输出以使其有用的情况. (2认同)