9
votes

Comment puis-je obtenir les dates de cette semaine à Perl?

J'ai la boucle suivante pour calculer les dates de la semaine en cours et les imprimer. Cela fonctionne, mais je nageons dans la quantité de possibilités de date / heure à Perl et que vous souhaitez obtenir votre opinion sur le fait qu'il y ait une meilleure façon. Voici le code que j'ai écrit: XXX

Comme mentionné, cela fonctionne, mais est-ce le plus rapide ou le plus efficace? Je suppose que la rapidité et l'efficacité ne peuvent pas nécessairement aller ensemble, mais vos commentaires sont très appréciés.


0 commentaires

4 Réponses :


4
votes

Vous pouvez utiliser l'objet DateTime pour obtenir le jour actuel de la semaine sous forme de nombre (1-7). Ensuite, utilisez simplement cela pour trouver le lundi de la semaine en cours. Par exemple:

my $today = DateTime->now;
my $start = $today->clone;

# move $start to Monday
$start->subtract( days => ( $today->wday - 1 ) );   # Monday gives 1, so on monday we
                                                    # subtract zero. 

my $end = $start->clone->add( days => 7 );


1 commentaires

Wow, c'est beaucoup plus simple. Merci!



16
votes

une version légèrement améliorée de la réponse de Friedo ... XXX

Cependant, cela suppose que lundi est le premier jour de la semaine. Le dimanche, commencez par ... xxx

de chaque sens, il est préférable d'utiliser la méthode tronquable que de la rétablir, car Friedo l'a fait; )


5 commentaires

Une question rapide - Est-ce que cela pour la boucle crée une nouvelle clone DateTime chaque itération? Est-ce que ça va de faire à Perl?


Notez que la version du dimanche ne fonctionne pas correctement. Vous devez -> ajouter (jours => 1) avant le -> tronquer ou commencer par le dimanche vous donnera le début de la semaine précédente.


Cool, je n'étais pas au courant de tronqua


@CJM: C'est un bon point. Je me demande s'il devrait y avoir un -> tronquer (to => 'locale-week') variante qui est sensible à la locale.


Ou peut-être quelque chose comme -> tronquer (to => 'week', départ => 7) . Ensuite, vous pourriez avoir vos semaines de commencer tous les jours. ( Démarrage serait bien sûr par défaut à 1 pour être cohérent avec le comportement actuel.)



1
votes

Cela devrait fonctionner:

$ ./week.pl 
Monday 24 May 2010
Tuesday 25 May 2010
Wednesday 26 May 2010
Thursday 27 May 2010
Friday 28 May 2010
Saturday 29 May 2010
Sunday 30 May 2010


2 commentaires

Si vous n'utilisez que POSIX pour StrfTime (qui est en effet une belle raison de l'utiliser), il serait préférable de dire: utilisez Posix QW (Strftime); De plus,% F donne au format AAAA-MM-DD L'affiche originale était après.


Merci. Il y a beaucoup d'autres nits à choisir ce code (qu'est-ce que wayday fait?), Mais je voulais fondamentalement, je voulais offrir un exemple de le faire sans DateTime , ce qui n'est pas 'T nécessaire pour cette tâche.



2
votes

Cela fonctionnerait-il:

use POSIX qw<mktime>;
my @week = map { mktime(( 0 ) x 3, $day + $_, $pmon, $pyear ) } 0..6;


2 commentaires

@Snake Plissken: Aucun problème. Nom cool. :)


Merci Axeman, votre code travaille sur Perl V5.8.8 sans module DateTime installé. C'est bien. Je ne peux pas installer aucun module sur mon serveur Prod.