package DateTime::Range; use strict; use DateTime; use vars '%months'; =head1 NAME DateTime::Range - decode strings like 2007Q3 to start and end date =head1 SYNOPSIS use DateTime::Range; my ($span) = @ARGV; # 2007Q3 or 199902 my ($first,$last) = DateTime::Range::get_days($span); printf "Report $part From %s to %s\n", map { $_->strftime('%Y%m%d') } $first,$last; =cut %months = ( 'Q1' => ['01','03'], 'Q2' => ['04','06'], 'Q3' => ['07','09'], 'Q4' => ['10','12'], 'H1' => ['01','06'], 'H2' => ['07','12'], '' => ['01','12'], ); for (1..12) { my $m = sprintf "%02d", $_; $months{$m} = [$m,$m]; }; sub get_days { my ($yearmonth) = @_; if ($yearmonth eq '--letzter-monat') { $yearmonth = DateTime->now; $yearmonth->set_day(1); $yearmonth->add( days => -1 ); $yearmonth = $yearmonth->strftime('%Y%m'); } my ($year,$month,$day) = ($yearmonth =~ /^(\d{4})(\d\d|Q[1234]|H[12]|)(\d\d)?$/); die "Weirdo date: '$yearmonth'" unless $year and defined $month; my ($start_month,$end_month) = @{$months{ $month }}; my ($first_day, $last_day); if ($day) { $first_day = $yearmonth; $last_day = $yearmonth; } else { $first_day = DateTime->new(year => $year, month => $start_month, day => 1)->strftime('%Y%m%d'); $last_day = DateTime->last_day_of_month(year => $year, month => $end_month)->strftime('%Y%m%d'); } ($first_day, $last_day) }; 1;