derick Sat May 3 10:03:21 2008 UTC
Modified files:
/php-src/ext/date/lib tm2unixtime.c
Log:
- Fixed weekdays algorithm.
http://cvs.php.net/viewvc.cgi/php-src/ext/date/lib/tm2unixtime.c?r1=1.25&r2=1.26&diff_format=u
Index: php-src/ext/date/lib/tm2unixtime.c
diff -u php-src/ext/date/lib/tm2unixtime.c:1.25
php-src/ext/date/lib/tm2unixtime.c:1.26
--- php-src/ext/date/lib/tm2unixtime.c:1.25 Fri May 2 12:48:19 2008
+++ php-src/ext/date/lib/tm2unixtime.c Sat May 3 10:03:21 2008
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: tm2unixtime.c,v 1.25 2008/05/02 12:48:19 derick Exp $ */
+/* $Id: tm2unixtime.c,v 1.26 2008/05/03 10:03:21 derick Exp $ */
#include "timelib.h"
@@ -197,35 +197,55 @@
static void do_adjust_special_weekday(timelib_time* time)
{
- timelib_sll current_dow, this_weekday = 0, count;
+ timelib_sll current_dow, count;
- current_dow = timelib_day_of_week(time->y, time->m, time->d);
count = time->relative.special.amount;
+
+ current_dow = timelib_day_of_week(time->y, time->m, time->d);
if (count == 0) {
+ // skip over saturday and sunday
if (current_dow == 6) {
- this_weekday = 2;
+ time->d += 2;
}
+ // skip over sunday
if (current_dow == 0) {
- this_weekday = 1;
+ time->d += 1;
}
- time->d += this_weekday;
- return;
} else if (count > 0) {
+ // skip over saturday and sunday
if (current_dow == 5) {
- this_weekday = 2;
+ time->d += 2;
}
+ // skip over sunday
if (current_dow == 6) {
- this_weekday = 1;
+ time->d += 1;
}
- } else if (count < 0) {
- if (current_dow == 0) {
- this_weekday = -1;
+ // add increments of 5 weekdays as a week
+ time->d += (count / 5) * 7;
+ // if current DOW plus the remainder > 5, add two days
+ current_dow = timelib_day_of_week(time->y, time->m, time->d);
+ time->d += (count % 5);
+ if ((count % 5) + current_dow > 5) {
+ time->d += 2;
}
+ } else if (count < 0) {
+ // skip over sunday and saturday
if (current_dow == 1) {
- this_weekday = -2;
+ time->d -= 2;
+ }
+ // skip over satruday
+ if (current_dow == 0 ) {
+ time->d -= 1;
+ }
+ // subtract increments of 5 weekdays as a week
+ time->d += (count / 5) * 7;
+ // if current DOW minus the remainder < 0, subtract two days
+ current_dow = timelib_day_of_week(time->y, time->m, time->d);
+ time->d += (count % 5);
+ if ((count % 5) + current_dow < 1) {
+ time->d -= 2;
}
}
- time->d += this_weekday + ((count / 5) * 7) + (count % 5);
}
static void do_adjust_special(timelib_time* time)
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php