Fwd: Re: [PEAR] Date_Calc::weekOfYear() bug?

From: Date: Wed, 27 Nov 2002 22:25:36 +0000
Subject: Fwd: Re: [PEAR] Date_Calc::weekOfYear() bug?
Groups: php.pear.dev 
Request: Send a blank email to pear-dev+get-11192@lists.php.net to get a copy of this message
Forgot to CC pear-dev yesterday with this addition/solution to that bug. --- "Jesus M. Castagnetto" <jcastagnetto@yahoo.com> wrote: > Date: Tue, 26 Nov 2002 11:25:21 -0800 (PST) > From: "Jesus M. Castagnetto" <jcastagnetto@yahoo.com> > To: Pierre-Alain Joye <paj@pearfr.org>, Ondrej Jombik <nepto@pobox.sk> > CC: pear-general@lists.php.net > Subject: Re: [PEAR] Date_Calc::weekOfYear() bug? > > Here is a patch that implements a gregorian to ISO conversion. Got the > algorithm from http://personal.ecu.edu/mccartyr/ISOwdALG.txt, > although it > seems > to me that the last part of that algorithm is missing a +1 when the ISO week > number is calculated (labelled as "kludge" in the patch). > > This can be used for the other methods. I testes if w/ the dates from the bug > report and from the email sent to this list: > > <?php > require './Calc.php'; > echo Date_Calc::gregorianToISO(1998,1,5) . ", "; > echo Date_Calc::gregorianToISO(1998,1,6)."\n"; > echo Date_Calc::gregorianToISO(2004,1,5) . ", "; > echo Date_Calc::gregorianToISO(2004,1,6)."\n"; > for ($i = 17; $i < 21; $i++) { > echo ">> ".Date_Calc::gregorianToISO(2002,11,$i)."\n"; > } > ?> > > Pierre-Alain: if you want I can commit this to CVS directly, in case your > connection is not too good today. > > ==== PATCH BELOW ==== > > --- Calc.php_orig Tue Nov 26 10:23:47 2002 > +++ Calc.php Tue Nov 26 11:13:47 2002 > @@ -1624,6 +1624,65 @@ > return($weekdays); > } // end func getWeekDays > > -} // end class Date_calendar > + /** > + * Converts from Gregorian Year-Month-Day to ISO > YearNumber-WeekNumber-WeekDay > + * > + * Uses ISO 8601 definitions. > + * Algorithm from Rick McCarty, 1999 at > http://personal.ecu.edu/mccartyr/ISOwdALG.txt > + */ > + function gregorianToISO($year, $month, $day) { > + $mnth = array (0,31,59,90,120,151,181,212,243,273,304,334); > + $y_isleap = Date_Calc::isLeapYear($year); > + $y_1_isleap = Date_Calc::isLeapYear($year - 1); > + $day_of_year_number = $day + $mnth[$month - 1]; > + if ($y_isleap && $month > 2) { > + $day_of_year_number++; > + } > + // find Jan 1 weekday (monday = 1, sunday = 7) > + $yy = ($year - 1) % 100; > + $c = ($year - 1) - $yy; > + $g = $yy + intval($yy/4); > + $jan1_weekday = 1 + intval((((($c / 100) % 4) * 5) + $g) % 7); > + // weekday for year-month-day > + $h = $day_of_year_number + ($jan1_weekday - 1); > + $weekday = 1 + intval(($h - 1) % 7); > + // find if Y M D falls in YearNumber Y-1, WeekNumber 52 or > + if ($day_of_year_number <= (8 - $jan1_weekday) && $jan1_weekday > 4){ > + $yearnumber = $year - 1; > + if ($jan1_weekday == 5 || ($jan1_weekday == 6 && $y_1_isleap)) { > + $weeknumber = 53; > + } else { > + $weeknumber = 52; > + } > + } else { > + $yearnumber = $year; > + } > + // find if Y M D falls in YearNumber Y+1, WeekNumber 1 > + if ($yearnumber == $year) { > + if ($y_isleap) { > + $i = 366; > + } else { > + $i = 365; > + } > + if (($i - $day_of_year_number) < (4 - $weekday)) { > + $yearnumber++; > + $weeknumber = 1; > + } > + } > + // find if Y M D falls in YearNumber Y, WeekNumber 1 through 53 > + if ($yearnumber == $year) { > + $j = $day_of_year_number + (7 - $weekday) + ($jan1weekday - 1); > + $weeknumber = intval($j / 7) + 1; // kludge!!! - JMC > + if ($jan1_weekday > 4) { > + $weeknumber--; > + } > + } > + // put it all together > + if ($weeknumber < 10) > + $weeknumber = '0'.$weeknumber; > + return "{$yearnumber}-{$weeknumber}-{$weekday}"; > + } > + > +} // end class Date_Calc > > ?> > > > ===== > --- Jesus M. Castagnetto (jcastagnetto@yahoo.com) > > Research: > http://metallo.scripps.edu/ > Personal: http://www.castagnetto.org/ > > __________________________________________________ > Do you Yahoo!? > Yahoo! Mail Plus - Powerful. Affordable. Sign up now. > http://mailplus.yahoo.com > > -- > PEAR General Mailing List (http://pear.php.net/) > To unsubscribe, visit: http://www.php.net/unsub.php > ===== --- Jesus M. Castagnetto (jcastagnetto@yahoo.com) Research: http://metallo.scripps.edu/ Personal: http://www.castagnetto.org/ __________________________________________________ Do you Yahoo!? Yahoo! Mail Plus - Powerful. Affordable. Sign up now. http://mailplus.yahoo.com

« previous php.pear.dev (#11192) next »