如何在Perl中对日期进行排序?
my @dates = ( "02/11/2009" , "20/12/2001" , "21/11/2010" );
我的数组中有以上日期。我该如何排序这些日期?
我的日期格式为dd/mm/YYYY
。
答案 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/01
和9999/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