8
votes

Comment puis-je trier les dates à Perl?

Comment puis-je trier les dates de Perl? XXX

J'ai des dates ci-dessus dans mon tableau. Comment puis-je trier ces dates?

mon format de date est jj / mm / aaaa .


1 commentaires

Stockage des dates comme aaaa / mm / dd est beaucoup plus facile. Vous pouvez faire ce que vous voulez quand vous les affichez.


4 Réponses :


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

3 commentaires

Faites cela avec une transformation schwartzienne ou une autre clé de clé en cache, vous n'avez donc pas à recompagner les valeurs à chaque fois.


@brian: merci, j'ai oublié ça :-)


Et si vos dates ont des horaires par ex. 29/4 / 2021-00: 10: 10 Vous pouvez scinder / ou - utiliser [\ / \-] et joindre des champs en arrière à l'aide de [2,1,0,3]. IE trier {joindre ('', (divisé '[\ / \ -]', $ a) [2,1,0,3]) joindre ("", (divisé "[\ / \ -] ', $ b) [2,1,0,3])}



4
votes

Je préfère le format aaaaa / mm / dd mieux, pour cette raison. Il est garanti de trier les dates correctement, entre 1000/01/01 et 9999/12/31 . xxx

Si vous en avez vraiment besoin Dans Format DD / MM / AAAA , vous pouvez toujours choisir une complète Transformer Schwartzian . xxx

ou xxx


0 commentaires

1
votes

ou utilisez le format EPOCH dans l'horodatage et les triez comme des chiffres. Ensuite, convertissez la sortie des chaînes de date comme vous le souhaitez. Ensuite, vous n'êtes pas coincé avec le formatage des chaînes d'origine.


1 commentaires

Serait utile si vous avez montré comment faire cela. Pouvez-vous ajouter un exemple?



1
votes

Beaucoup de gens ici ont fait valoir correctement que le format original des dates doit être au format AAAA-MM-DD, mais personne n'a donné au code PERL pouvant gérer ce cas encore. Alors, voici:

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


2 commentaires

La réponse de Brad Gilbert contient du code pour cette affaire. C'est juste @dates = trier @dates; .


Ah, bon point - mais j'aime mon exemple parce que cela fonctionne réellement sur une gamme de valeurs correctes (aucune magie de carte fragmentaire), il affiche les deux commandes en expliquant l'explication ascendante par rapport à la descente et n'inspire inutilement les valeurs triées.