2010-03-21 4 views
3

J'ai plusieurs milliers d'objets avec une propriété de chaîne au format "yyyy-MM-ddTHH:mm:ssZ". Je veux trier ces objets par le temps.Comment puis-je trier les horodatages en Perl?

Y a-t-il des paquets ou des scripts utiles pour cela?

(Actuellement, je suis juste la comparaison des valeurs numériques individuelles et il semble que ce n'est pas très efficace et propre.)

+0

Vous voulez dire comparer la valeur de TTT, la valeur de MM, etc.? Si oui vous indead besoin de convertir la chaîne complète à la valeur d'horodatage ... – kriss

Répondre

3

Vous pouvez utiliser Time :: Local pour convertir votre date en timestamp ou l'un des modules Date :: de cpan. Vous pouvez jeter un oeil à this pour voir ce qui est disponible. Notez également qu'avec le tri des formats ci-dessus, les objets lexicographiques pourraient aussi faire l'affaire (même si c'est probablement un peu plus lent que la comparaison des nombres, mais la conversion initiale a un coût).

Faites attention si vous utilisez des dates de partout dans le monde car vous risquez de rencontrer des problèmes de tri avec le fuseau horaire et l'heure d'été. Si toutes les dates sont au même endroit, cela devrait être OK.

5

Horodatage dans ce format peut être triée lexicographique, si perl normal « sorte » et la fonction de comparaison de chaînes " cmp "sont suffisants.

+0

@Stuart: Je pensais aussi au premier abord, mais ne serait pas la partie fuseau horaire (Z) pourrait soulever un problème? – kriss

+1

@kriss: mais c'est le dernier caractère donc cela signifierait que tout le reste est égal –

+0

@kemp: oui, c'est le problème, ce qui est avant est égal mais si ce n'est pas lié au même temps de référence comparant peut donner un mauvais résultat. – kriss

7

sort sans tri une fonction de tri dans l'ordre lexicographique. Cela répond à vos besoins.

@sorted = sort @timestamps; 
+0

Je pense qu'il veut trier la liste par temps d'abord, pas la date. – Zaid

+0

désolé pour la confusion. Je veux les trier par datetime. – ablimit

+3

Le principal avantage de l'ordre ISO-8601 pour les horodatages tous dans le même fuseau horaire (Z, Zulu ou UTC dans l'exemple) est qu'ils peuvent être triés de manière alphanumérique dans l'ordre date/heure. Si vous avez plusieurs fuseaux horaires à traiter, c'est une nuisance (vous devez les convertir tous en UTC, ce qui n'est pas trivial, puis trier les valeurs UTC). Mais les fuseaux horaires = problème en général. –

0

Si votre format de chaîne est rigide, vous pouvez utiliser la sous-routine suivante pour trier votre liste de dates.

sub timeSort { 

    my ($time) = (shift =~ /\d{2}:\d{2}:\d{2}/); 
    return $time; 
} 

my @sortedList = sort { timeSort($a) <=> timeSort($b) } @oldList; 
+0

'$ _ [0]' au lieu d'utiliser 'shift' pourrait être plus rapide (puisqu'il sera appelé plusieurs fois pour le tri). Sinon, c'est comme ça que je le ferais aussi. –

Questions connexes