my $one_month_ago = DateTime
->now( time_zone => 'local' )
->subtract( days => 30 );
####
use DateTime;
my $dt = DateTime->new(year=>2017,month=>3,day=>1);
print $dt->ymd, "\n";
print "-30 days: ",
$dt->clone->subtract(days=>30)->ymd, " ";
system('date','+%Y-%m-%d','-d 2017-03-01 -30 days')==0 or die $?;
print "-1 month: ",
$dt->clone->subtract(months=>1)->ymd, " ";
system('date','+%Y-%m-%d','-d 2017-03-01 -1 month')==0 or die $?;
__END__
2017-03-01
-30 days: 2017-01-30 2017-01-30
-1 month: 2017-02-01 2017-02-01
####
use DateTime;
my $dt = DateTime->now->truncate(to=>'month');
for (1..24) {
my $last = $dt->clone->add(months=>1)->subtract(days=>1);
print $dt->ymd," to ",$last->ymd,"\n";
$dt->subtract(months=>1);
}
__END__
2017-06-01 to 2017-06-30
2017-05-01 to 2017-05-31
2017-04-01 to 2017-04-30
... etc.
####
use DateTime;
my $now = DateTime->now;
for ( my $dt = $now->clone->truncate(to=>'month')
->subtract(years=>2)->add(months=>1);
$dt < $now;
$dt->add(months=>1) ) {
my $last = DateTime->last_day_of_month(year=>$dt->year,
month=>$dt->month,time_zone=>$dt->time_zone);
print $dt->ymd," to ",$last->ymd,"\n";
}
__END__
2015-07-01 to 2015-07-31
2015-08-01 to 2015-08-31
2015-09-01 to 2015-09-30
...