Perl: Backdating to Sunday: Difference between revisions
From Rabbi Blog
(Migration - Backdating to Sunday) |
mNo edit summary |
||
| (4 intermediate revisions by the same user not shown) | |||
| Line 1: | Line 1: | ||
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. | 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. | ||
[[Image:Backdatingsunday.JPG|thumb|right|The notes]] | |||
<pre> | <pre> | ||
use Date::DayOfWeek; | use Date::DayOfWeek; | ||
| Line 38: | Line 38: | ||
### Check for March Roll back to Feb | ### Check for March Roll back to Feb | ||
### Honor the Leap Year | ### Honor the Leap Year | ||
if ($tmpmonth = | if ($tmpmonth =~ m/03/) | ||
{ | { | ||
if (isleap($tmpyear)) | if (isleap($tmpyear)) | ||
| Line 52: | Line 52: | ||
} | } | ||
#Check for transitions INTO 31 day months | #Check for transitions INTO 31 day months | ||
elsif ($tmpmonth =~ m/02|04| | elsif ($tmpmonth =~ m/02|04|06|09|11/) | ||
{ | { | ||
$tmpday=(31-abs($test)); | $tmpday=(31-abs($test)); | ||
| Line 62: | Line 62: | ||
$tmpday=(30-abs($test)); | $tmpday=(30-abs($test)); | ||
$tmpmonth--; | $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 | #Check for transitions into December | ||
#Roll both the Month & Year back | #Roll both the Month & Year back | ||
elsif ($tmpmonth = | elsif ($tmpmonth =~ m/01/) | ||
{ | { | ||
$tmpday=(31-abs($test)); | $tmpday=(31-abs($test)); | ||
| Line 72: | Line 79: | ||
} | } | ||
} | } | ||
#Put the date back together | #Put the date back together | ||
$DateA="$tmpyear$tmpmonth$tmpday"; | $DateA="$tmpyear$tmpmonth$tmpday"; | ||
| Line 97: | Line 93: | ||
[[Category:Perl]] | [[Category:Perl]] | ||
[[Category:2006-08]] | [[Category:Weblog-2006-08]] | ||
Latest revision as of 14:38, 31 December 2007
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";
}
}