use strict;
use warnings;
use feature qw( say );
use DateTime qw( );
# Or using your favourite DateTime::Format parser.
my $date1 = DateTime->new( year => 1981, month => 2, day => 1 );
my $date2 = DateTime->new( year => 1982, month => 2, day => 5 );
####
my $ref = DateTime->new( year => 1980, month => 1, day => 1 );
say $date1->delta_days($ref)->in_units('days');
say $date2->delta_days($ref)->in_units('days');
##
##
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} }";
}