我有以下循环来计算当前周的日期并打印出来.它有效,但我在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所做的那样;)