我有以下循环来计算当前周的日期并打印出来.它有效,但我在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 ); }
如上所述,这是有效的,但它是最快还是最有效的?我猜测速度和效率可能不一定在一起,但您的反馈非常感谢.
解决方法
friedo的答案略有改进……
my $start_of_week = DateTime->today() ->truncate( to => 'week' ); for ( 0..6 ) { print $start_of_week->clone()->add( days => $_ ); }
但是,这假设星期一是一周的第一天.星期天,从…开始
my $start_of_week = DateTime->today() ->truncate( to => 'week' ) ->subtract( days => 1 );
无论哪种方式,最好使用truncate方法而不是重新实现它,就像friedo所做的那样;)