Just wanted to thank you guys for responding. For my needs the solution
proposed by Venkat worked almost perfectly. I only needed to modify so
that I would get the actual date that the 5th Saturday fell on. My
subroutine looks like

for ($mon = $month; $mon == $month; $time += 86400) {
        my ($wday);
        ($day, $mon, $wday) = (localtime($time))[3,4, 6];
        if ($wday == $week_day) {
           $wday_count++;
                if ($wday_count == 5) {
                        $mon = $mon +1;
                        $year += 1900;
                        if ($day ne 1) {
                        return("$mon/$day/$year");
                        }
                }
        }

-----Original Message-----
From: Shlomi Fish [mailto:shlo...@iglu.org.il] 
Sent: Wednesday, December 23, 2009 6:02 AM
To: beginners@perl.org
Cc: Venkat Saranathan; Johnson, Reginald (GTS)
Subject: Re: Saturdays in a month

On Tuesday 22 Dec 2009 17:27:41 Venkat Saranathan wrote:
> You can code a simple time logic to calculate this. Here is a sample
code.
> (Bugs included :))

Yes, indeed. :-) Bugs are included. See below for my comments.

> 
>  #!/usr/bin/perl
> 
> use Time::Local;
> use strict;
> 

You should add use warnings;

> sub day_in_a_month {
>     my ($week_day, $month, $year ) = @_;
>     my ($day, $hour, $min, $sec, $time);
>     my ($mon, $wday_count);
> 
>     $day = 1;
>     $hour = $min = $sec = 0;
>     $month--;
>     $year -= 1900;
> 
>     $time = timelocal($sec, $min, $hour, $day, $month, $year);
> 
>     for ($mon = $month; $mon == $month; $time += 86400) {

86400 is a magic number which some people may not be familiar with. You
should 
assign it to a constant. Furthermore, it's not a very robust way to go a
day 
forward. You should use POSIX::mktime() instead.

>         my ($wday);
>         ($mon, $wday) = (localtime($time))[4, 6];
>         if ($wday == $week_day) {
>            $wday_count++;
>         }
>     }
>     return($wday_count);
> }
> 

Here is my version that uses DateTime (a non-core module, but highly 
recommended) and seems to work. One can do it more efficiently in an
O(1) (= 
constant time) manner by futzing with the initial day-of-week in Month
day #1 
and the number of days in a month, but I didn't get to it yet. My
version 
works from what I tried:

<<<<<<<<<<<<<<<<<
#!/usr/bin/perl

use strict;
use warnings;

use DateTime;

sub day_in_a_month
{
    # week_day is:
    # 1-7 (Monday is 1) - also dow, wday
    # From http://search.cpan.org/dist/DateTime/lib/DateTime.pm

    my ($week_day, $month, $year ) = @_;

    my $start = DateTime->new( year => $year, month => $month, day =>
1);
    
    my $end = $start->clone();
    $end->add( months => 1);

    my $running = $start->clone();

    my $count = 0;

    while (DateTime->compare($end, $running) != 0)
    {
        if ($running->day_of_week() == $week_day)
        {
            $count++;
        }
    }
    continue
    {
        $running->add (days => 1);
    }

    return $count;
}

print day_in_a_month(@ARGV), "\n";
>>>>>>>>>>>>>>>>>

<<<<<<<<<<
shlomi:~$ perl num_days.pl 7 12 2009
4
shlomi:~$ perl num_days.pl 7 11 2009
5
shlomi:~$ perl num_days.pl 6 11 2009
4
shlomi:~$ perl num_days.pl 6 12 2009
4
>>>>>>>>>>

Regards,

        Shlomi Fish

> # 0 - sunday 6- saturday
> print day_in_a_month(6, 12, 2009), "\n";
> 
> 
> with warm regards,
> Venkat Saranathan
> Gulf Breeze Software.
> 
> 
> On Tue, Dec 22, 2009 at 9:51 AM, Johnson, Reginald (GTS) <
> 
> reggie_john...@ml.com> wrote:
> >  Is there a module that I can use that will tell me the number of
> > Saturdays, or any weekday, if I give it the month and year.
> >
> > Reginald Johnson
> >
> > TSM Backup & Restore Services
> >
> > [image: Picture (Device Independent Bitmap)]
> >
> > Jacksonville, FL
> >
> > 904.218.4620
> >
> >  ------------------------------
> >  This message w/attachments (message) may be privileged,
confidential or
> > proprietary, and if you are not an intended recipient, please notify
the
> > sender, do not use or share it and delete it. The information
contained
> > in this e-mail was obtained from sources believed to be reliable;
> > however, the accuracy or completeness of this information is not
> > guaranteed. Unless specifically indicated, this message is not an
offer
> > to sell or a solicitation of any investment products or other
financial
> > product or service, an official confirmation of any transaction, or
an
> > official statement of Merrill Lynch.  Subject to applicable law,
Merrill
> > Lynch may monitor, review and retain e-communications (EC) traveling
> > through its networks/systems. The laws of the country of each
> > sender/recipient may impact the handling of EC, and EC may be
archived,
> > supervised and produced in countries other than the country in which
you
> > are located. This message cannot be guaranteed to be secure or
> > error-free.  References to "Merrill Lynch" are references to any
company
> > in the Merrill Lynch & Co., Inc. group of companies, which are
> > wholly-owned by Bank of America Corporation. Securities and
Insurance
> > Products: * Are Not FDIC Insured  * Are Not Bank Guaranteed  *  May
Lose
> > Value  *  Are Not a Bank Deposit * Are Not a Condition to Any
Banking
> > Service or Activity * Are Not Insured by Any Federal Government
Agency. 
> > Past performance is no guarantee of future results. Attachments that
are
> > part of this E-communication may have additional important
disclosures
> > and disclaimers, which you should read. This message is subject to
terms
> > available at the following link:
> > http://www.ml.com/e-communications_terms/.  By messaging with
Merrill
> > Lynch you consent to the foregoing.
> >  ------------------------------
> 

-- 
-----------------------------------------------------------------
Shlomi Fish       http://www.shlomifish.org/
Parody on "The Fountainhead" - http://shlom.in/towtf

Bzr is slower than Subversion in combination with Sourceforge. 
( By: http://dazjorz.com/ )

--------------------------------------------------------------------------
This message w/attachments (message) may be privileged, confidential or 
proprietary, and if you are not an intended recipient, please notify the 
sender, do not use or share it and delete it. The information contained in this 
e-mail was obtained from sources believed to be reliable; however, the accuracy 
or completeness of this information is not guaranteed. Unless specifically 
indicated, this message is not an offer to sell or a solicitation of any 
investment products or other financial product or service, an official 
confirmation of any transaction, or an official statement of Merrill Lynch. 
Subject to applicable law, Merrill Lynch may monitor, review and retain 
e-communications (EC) traveling through its networks/systems. The laws of the 
country of each sender/recipient may impact the handling of EC, and EC may be 
archived, supervised and produced in countries other than the country in which 
you are located. This message cannot be guaranteed to be secure or error-free. 
References to "Merrill Lynch" are references to any company in the Merrill 
Lynch & Co., Inc. group of companies, which are wholly-owned by Bank of America 
Corporation. Securities and Insurance Products: * Are Not FDIC Insured * Are 
Not Bank Guaranteed * May Lose Value * Are Not a Bank Deposit * Are Not a 
Condition to Any Banking Service or Activity * Are Not Insured by Any Federal 
Government Agency. Past performance is no guarantee of future results. 
Attachments that are part of this E-communication may have additional important 
disclosures and disclaimers, which you should read. This message is subject to 
terms available at the following link: 
http://www.ml.com/e-communications_terms/. By messaging with Merrill Lynch you 
consent to the foregoing.
--------------------------------------------------------------------------
 

--
To unsubscribe, e-mail: beginners-unsubscr...@perl.org
For additional commands, e-mail: beginners-h...@perl.org
http://learn.perl.org/


Reply via email to