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/