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

Reply via email to