> Hi Guys, > > I'm having a real hard time trying to figure this out.. > > There are tons of modules on dates, etc, but I can't seem to > find one to do > what I need. > > I have one date, for example: 2004-07-07. > > I need to take that date, get Monday's date and Sunday's date > where 2004-07-07 > is between. > > Any suggestions? > > Thanks!! > -c
This was a fun little problem! No special modules are needed. I believe POSIX and Time::Local should be in every distribution. I tested this with ActivePerl 5.8.3 on Win32. use strict; use warnings; use Time::Local qw(timelocal); use POSIX qw(strftime); unless ($ARGV[0] =~ /^\d{4}-\d{2}-\d{2}$/) { die "Date given must be in YYYY-MM-DD form.\n"; } my @given_date = split /-/, $ARGV[0]; my $given_year = shift @given_date; # Months start at zero my $given_month = shift @given_date; --$given_month; my $given_day = shift @given_date; # We want these dates # Monday ... Given Date ... Sunday # ^^^^^^ ^^^^^^ # 1 X 0(7) my $given_time = timelocal(0, 0, 0, $given_day, $given_month, $given_year); # Get the day of week of given date. # 0 is Sunday, 1 is Monday, 6 is Saturday my $wday = (localtime($given_time))[6]; my $days_to_prev_monday; my $days_to_next_sunday; if ($wday == 0) { # Given date is a Sunday # Next Sunday is 7 days from now # Previous Monday is six days ago $days_to_prev_monday = 6; $days_to_next_sunday = 7; } elsif ($wday == 1) { # Given date is a Monday # Previous Monday is 7 days ago # Next Sunday is six days from now $days_to_prev_monday = 7; $days_to_next_sunday = 6; } else { # Date given is between a Monday and a Sunday $days_to_prev_monday = $wday - 1; $days_to_next_sunday = 7 - $wday; } # Time returned from timelocal is in seconds, time given to # localtime is in seconds as well. 86400 seconds in a day. my @prev_mon_date = localtime($given_time - ($days_to_prev_monday * 86400)); my @next_sun_date = localtime($given_time + ($days_to_next_sunday * 86400)); my $previous_monday = strftime '%Y-%m-%d', @prev_mon_date; my $next_sunday = strftime '%Y-%m-%d', @next_sun_date; print "Previous Monday: $previous_monday\n"; print "Given Date: $ARGV[0]\n"; print "Next Sunday: $next_sunday\n"; -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] <http://learn.perl.org/> <http://learn.perl.org/first-response>