Как сортировать даты в Perl?

Как сортировать даты в Perl?

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

у меня есть выше даты в моем массиве . Как я могу сортировать эти даты?

мой формат даты dd/mm/YYYY.

4 ответов


@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;

Update: более эффективным подходом является преобразование Шварца:

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

Я предпочитаю YYYY/MM/DD формат лучше, именно по этой причине. Гарантируется правильная сортировка дат между 1000/01/01 и 9999/12/31.

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

Если вам действительно нужно это в DD/MM/YYYY формат, вы всегда можете пойти на полный преобразование Шварца.

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;

или используйте формат эпохи в метке времени и сортируйте их как числа. Затем преобразуйте выходные данные строк даты, как вы хотите. Тогда вы не застряли с форматированием исходных строк.


многие люди здесь правильно утверждали, что исходный формат дат должен быть в формате гггг-ММ-ДД, но никто не дал код 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