如何在Perl中对日期进行排序?

时间:2010-03-22 10:40:14

标签: perl sorting

如何在Perl中对日期进行排序?

my @dates =  ( "02/11/2009" , "20/12/2001" , "21/11/2010" ); 

我的数组中有以上日期。我该如何排序这些日期?

我的日期格式为dd/mm/YYYY

4 个答案:

答案 0 :(得分:18)

@dates = sort { join('', (split '/', $a)[2,1,0]) cmp join('', (split '/', $b)[2,1,0]) } @dates;

或使用单独的排序子程序:

sub mysort {
    join('', (split '/', $a)[2,1,0]) cmp join('', (split '/', $b)[2,1,0]);
}
@dates = sort mysort @dates;

更新:一种更有效的方法是Schwartzian变换:

@dates = 
    map $_->[0],
    sort { $a->[1] cmp $b->[1] }
    map  [ $_, join('', (split '/', $_)[2,1,0]) ], @dates;

答案 1 :(得分:3)

出于这个原因,我更喜欢YYYY/MM/DD格式。我们保证在1000/01/019999/12/31之间正确排序日期。

my @sorted_alt = sort map { join '/', reverse split '/', $_  } @dates;

如果你真的需要DD/MM/YYYY格式,那么你总是可以选择一个完整的Schwartzian transform

my @sorted = map {
  join '/', reverse split '/', $_
}
sort
map {
  join '/', reverse split '/', $_ 
} @dates;

my @sorted = map {
  join '/', reverse @$_
}
sort { "@$a" cmp "@$b" }
map {
  [ reverse split '/', $_ ]
} @dates;

答案 2 :(得分:1)

或者在时间戳中使用纪元格式并将其排序为数字。然后根据需要转换日期字符串输出。然后你不会停留格式化原始字符串。

答案 3 :(得分:1)

这里的很多人都认为日期的原始格式应该是yyyy-mm-dd格式,但是没有人给出了可以处理这种情况的Perl代码。所以这就是:

my @dates = (
    '2014-08-15',
    '2016-09-13',
    '2001-01-02',
    '1998-09-22',
    '1998-09-21',
    '1998-09-23',
    '1999-04-20',
    '2020-01-30',
);

@dates = sort {$a cmp $b} @dates;   # 1998 is the first date's year
@dates = sort {$b cmp $a} @dates;   # 2014 is the first date's year