# a core method determine start/end dates of prior months use strict; use warnings; use Time::Local; my @startend; # [0] is current noncompleted month others are full months back # in each of those the sub elements are # [0] yyyy mm # [1] is start yyyy mm dd # [2] is end yyyy mm dd my $date; my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =localtime(time) ; # move to noon so DST changes dont kill ya my $now_fix12=timelocal( 0, 0, 12, $mday, $mon, $year); $date=$now_fix12; my $back=24; for my $m (0..$back) {push @startend,['']}; my $todo=0; my $doing; my ($ym,$ymd); $doing=$startend[$todo]; ($date,$ym,$ymd)=getparts($date); startup($doing,$ym,$ymd); while (1) { ($date,$ym,$ymd)=getparts($date); # print $ymd."\n"; unless ($doing->[0] eq $ym) { $todo++; last if ($todo>$back); $doing=$startend[$todo]; startup($doing,$ym,$ymd); } else {$doing->[1]=$ymd; } } # while for my $doing (@startend) { print join(' | ',@$doing)."\n"; } exit; sub startup { my $doing=shift; my $ym=shift; my $ymd=shift; $doing->[0]=$ym; $doing->[1]=$ymd; $doing->[2]=$ymd; } # startup sub getparts { my $date=shift; my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =localtime($date) ; my $ymd=sprintf('%4d %02d %02d',$year+1900,$mon+1,$mday); my $ym=substr($ymd,0,7); $date=$date-24*60*60; return ($date,$ym,$ymd); }