use strict;
use warnings;
use DateTime qw( );
my $s = DateTime->new(year => 2010, month => 4, day => 1);
my $e = DateTime->new(year => 2010, month => 10, day => 10);
my $week_s = $s;
my $week_e;
my $week_c;
while ($week_s <= $e) {
# First Sunday on or after $week_s
( $week_e = $week_s->clone() )
->add( days => 7 - $week_s->dow() % 7 );
$week_e = $e->clone if $week_e > $e;
printf("Week %s: %s to %s\n",
++$week_c,
$week_s->strftime('%x'),
$week_e->strftime('%x'),
);
( $week_s = $week_e->clone() )
->add( days => 1 );
}