> 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>


Reply via email to