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

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