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 ); }