I had a need to build an array of months between a set month and the current month. My purpose was to let the user choose a month to build a report for.

I’m using this on the web, so I’m printing out dates.

You’ll need Date::Manip::Recur

# Returns a date like "2011-01-01"
my $monStart = getOldestEntry($account);

use Date::Manip::Recur;
  my $recur = new Date::Manip::Recur;
  # Parse out the first of the month for every month since start until today.
  my $err = $recur->parse('0:0*0:0:0:0:0',$monStart,$monStart,"Today");
  # Return an array object of dates
  my @dates = $recur->dates();

# Loop through the date objects
for (@dates) {
  # Assign the current month value to a scalar.
  my $curMonth = $_->value();
  # I only cared to see YYYYMM so I regex'd it.
  $curMonth =~ s/^(\d{4})(\d{2}).*$/$1$2/;
  print parseMonth($curMonth)
}

sub parseMonth {
use Time::Local;
use Date::Format;
  my $md = shift;

  # Match on YYYYMM
  $date =~ m/^(\d{4})(\d{2})/;
  my $year = $1; my $mon = $2;

  # Convert to epoch
  my $time = timelocal(0,0,0,1,$mon-1,$year);

# Return back (%B %Y) as "August 2010"
return(time2str("%B %Y", $time));
}