sub last_day_of_year { ( my $dt = DateTime->new( year => $_[0], month => 1, day => 1 ) ) ->add( years => 1, days => -1 ); return $dt->day_of_year(); } my %in_range; my $year1 = $date1->year(); my $year2 = $date2->year(); if ($year1 == $year2) { $in_range{$year1} = [ $date1->day_of_year()-1 .. $date2->day_of_year()-1 ]; } else { $in_range{$year1} = [ $date1->day_of_year()-1 .. last_day_of_year($year1)-1 ]; for my $year ($year1+1 .. $year2-1) { $in_range{$year} = [ 0 .. last_day_of_year($year)-1 ]; } $in_range{$year2} = [ 0 .. $date2->day_of_year()-1 ]; } for my $year (sort { $a <=> $b } keys(%in_range)) { say "$year: @{ $in_range{$year} }"; }