Tengo el siguiente ciclo para calcular las fechas de la semana actual e imprimirlas. Funciona, pero estoy nadando en la cantidad de posibilidades de fecha/hora en Perl y quiero obtener tu opinión sobre si hay una mejor manera. Aquí está el código que he escrito:¿Cómo puedo obtener las fechas de esta semana en Perl?
#!/usr/bin/env perl
use warnings;
use strict;
use DateTime;
# Calculate numeric value of today and the
# target day (Monday = 1, Sunday = 7); the
# target, in this case, is Monday, since that's
# when I want the week to start
my $today_dt = DateTime->now;
my $today = $today_dt->day_of_week;
my $target = 1;
# Create DateTime copies to act as the "bookends"
# for the date range
my ($start, $end) = ($today_dt->clone(), $today_dt->clone());
if ($today == $target)
{
# If today is the target, "start" is already set;
# we simply need to set the end date
$end->add(days => 6);
}
else
{
# Otherwise, we calculate the Monday preceeding today
# and the Sunday following today
my $delta = ($target - $today + 7) % 7;
$start->add(days => $delta - 7);
$end->add(days => $delta - 1);
}
# I clone the DateTime object again because, for some reason,
# I'm wary of using $start directly...
my $cur_date = $start->clone();
while ($cur_date <= $end)
{
my $date_ymd = $cur_date->ymd;
print "$date_ymd\n";
$cur_date->add(days => 1);
}
Como se mencionó, esto funciona, pero ¿es el más rápido o más eficiente? Supongo que la rapidez y la eficiencia no necesariamente van de la mano, pero sus comentarios son muy apreciados.
Gracias por el código actualizado. – ABach
Una pregunta rápida: ¿eso para loop crea un nuevo clon DateTime en cada iteración? ¿Eso está bien que hacer en Perl? – ABach
Tenga en cuenta que la versión del domingo no funciona correctamente. Necesita '-> agregar (días => 1)' antes de '-> truncar', o comenzar con Domingo le dará el inicio de la semana anterior. – cjm