use Time::Local; use strict; use warnings; my ($from, $to, $range); $from = '2010-06-01'; $to = '2011-01-01'; if (!($range = dateRange($from, $to, 3))) { print "Could not calculate.\n"; } else { print "@$range"; } sub dateRange { my ($fd, $td, $n) = @_; my (@range); $range[0] = $fd; $range[$n] = $td; $fd = [split /-/, $fd]; $td = [split /-/, $td]; ### Calculate timestamps from given dates ### Croaks on bad date, so have to eval just in case eval { ### Make sure to use timestamp from middle of day ### to eliminate potential problems with Daylight ### Savings or day rounding $fd = timelocal(undef, undef, 12, $fd->[2], $fd->[1]-1, $fd->[0]); $td = timelocal(undef, undef, 12, $td->[2], $td->[1]-1, $td->[0]); }; return if $@; ### Calculate intermediate timestamps ### Reverse from timestamps back to dates for (1..($n-1)) { @_ = localtime($fd + ($td - $fd) / $n * $_); $range[$_] = sprintf('%04d-%02d-%02d', $_[5] + 1900, $_[4] + 1, $_[3]); } return \@range; }