# Perl: Backdating to Sunday

### From Rabbi Blog

Spent a little time on this in a related work project: backdating a date to the Sunday of the same week. Sounded simple at first, however I finally resulted to a dry erase board to map it out before coding it. Funny how leaving the terminal sometimes is a good thing.

use Date::DayOfWeek; use Date::Leapyear; if ($DateA =~ /(\d{4})(\d{2})(\d{2})/) { my $tmpyear = $1; #Year my $tmpmonth = $2; #Month my $tmpday = $3; #Day #Determine the day of week #Sun0,Mon1,Tue2,Wed3,Tr4,Fri6,Sat7 my $DOW = dayofweek($tmpday, $tmpmonth, $tmpyear); #Determine what happens when we subtract the value of #the date from the Day. #If it is positive, then we remain in the week. #If it is Zero, then the date is Sunday and no roll is needed #If it is negative, then we've moved back in the previous week #If we are previous week, we need to make sure that #we check roll to the previous month. If the current month #is Jan, we need to roll the year back also. my $test = $tmpday - $DOW; #Positive Outcome if ($test > 0) { $tmpday=$test; } #Negative Outcome elsif ($test < 0) { ### Check for March Roll back to Feb ### Honor the Leap Year if ($tmpmonth =~ m/03/) { if (isleap($tmpyear)) { $tmpday=(29-abs($test)); $tmpmonth--; } else { $tmpday=(28-abs($test)); $tmpmonth--; } } #Check for transitions INTO 31 day months elsif ($tmpmonth =~ m/02|04|06|09|11/) { $tmpday=(31-abs($test)); $tmpmonth--; } #Check for transitions INTO 30 day months elsif ($tmpmonth =~ m/05|07|08|10|12/) { $tmpday=(30-abs($test)); $tmpmonth--; } #Check for transitions from August #Roll both the Month with 31 days elsif ($tmpmonth =~ m/08/) { $tmpday=(31-abs($test)); $tmpmonth=12; } #Check for transitions into December #Roll both the Month & Year back elsif ($tmpmonth =~ m/01/) { $tmpday=(31-abs($test)); $tmpmonth=12; $tmpyear--; } } #Put the date back together $DateA="$tmpyear$tmpmonth$tmpday"; # Cludge to test to make sure that no new date is greater than 0 and let us know if so # Irrelevant to the output my $TESTDOW = dayofweek($tmpday, $tmpmonth, $tmpyear); if ($TESTDOWN>0) { print "!\n"; } }