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: 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. P> p>
4 Réponses :
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 );
Wow, c'est beaucoup plus simple. Merci!
une version légèrement améliorée de la réponse de Friedo ... Cependant, cela suppose que lundi est le premier jour de la semaine. Le dimanche, commencez par ... p> de chaque sens, il est préférable d'utiliser la méthode tronquable code> que de la rétablir, car Friedo l'a fait; ) p> p>
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) code> avant le
-> tronquer code> 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 code>
@CJM: C'est un bon point. Je me demande s'il devrait y avoir un -> tronquer (to => 'locale-week') code> variante qui est sensible à la locale.
Ou peut-être quelque chose comme -> tronquer (to => 'week', départ => 7) code>. Ensuite, vous pourriez avoir vos semaines de commencer tous les jours. (
Démarrage code> serait bien sûr par défaut à 1 pour être cohérent avec le comportement actuel.)
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
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 code> fait?), Mais je voulais fondamentalement, je voulais offrir un exemple de le faire sans
DateTime code>, ce qui n'est pas 'T nécessaire pour cette tâche.
Cela fonctionnerait-il:
use POSIX qw<mktime>; my @week = map { mktime(( 0 ) x 3, $day + $_, $pmon, $pyear ) } 0..6;
@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.