]> granicus.if.org Git - php/commitdiff
- Fixed bug #33414 (Comprehensive list of incorrect days returned after
authorDerick Rethans <derick@php.net>
Thu, 1 Sep 2005 12:41:43 +0000 (12:41 +0000)
committerDerick Rethans <derick@php.net>
Thu, 1 Sep 2005 12:41:43 +0000 (12:41 +0000)
  strtotime() / date() tests).

ext/date/lib/parse_tz.c
ext/date/tests/bug33414-2.phpt

index deaef0a069a235b874b3f8d70bd2266f5095a5ac..7a6e683eb19672f630e509a20e71b3dbc519211c 100644 (file)
@@ -164,6 +164,15 @@ void timelib_dump_tzinfo(timelib_tzinfo *tz)
        printf("Local types count: %lu\n", (unsigned long) tz->typecnt);
        printf("Zone Abbr. count:  %lu\n", (unsigned long) tz->charcnt);
 
+       printf ("%8s (%12s) = %3d [%5ld %1d %3d '%s' (%d,%d)]\n",
+               "", "", 0,
+               (long int) tz->type[0].offset,
+               tz->type[0].isdst,
+               tz->type[0].abbr_idx,
+               &tz->timezone_abbr[tz->type[0].abbr_idx],
+               tz->type[0].isstdcnt,
+               tz->type[0].isgmtcnt
+               );
        for (i = 0; i < tz->timecnt; i++) {
                printf ("%08X (%12d) = %3d [%5ld %1d %3d '%s' (%d,%d)]\n",
                        tz->trans[i], tz->trans[i], tz->trans_idx[i],
@@ -244,6 +253,8 @@ static ttinfo* fetch_timezone_offset(timelib_tzinfo *tz, timelib_sll ts, timelib
 {
        uint32_t i;
 
+       /* If there is no transistion time, we pick the first one, if that doesn't
+        * exist we return NULL */
        if (!tz->timecnt || !tz->trans) {
                *transition_time = 0;
                if (tz->typecnt == 1) {
@@ -252,10 +263,26 @@ static ttinfo* fetch_timezone_offset(timelib_tzinfo *tz, timelib_sll ts, timelib
                return NULL;
        }
 
+       /* If the TS is lower than the first transistion time, then we scan over
+        * all the transistion times to find the first non-DST one, or the first
+        * one in case there are only DST entries. Not sure which smartass came up
+        * with this idea in the first though :) */
        if (ts < tz->trans[0]) {
+               uint32_t j;
+
                *transition_time = 0;
-               return &(tz->type[tz->trans_idx[tz->timecnt - 1]]);
+               j = 0;
+               while (j < tz->timecnt && tz->type[j].isdst) {
+                       ++j;
+               }
+               if (j == tz->timecnt) {
+                       j = 0;
+               }
+               return &(tz->type[j]);
        }
+
+       /* In all other cases we loop through the available transtion times to find
+        * the correct entry */
        for (i = 0; i < tz->timecnt; i++) {
                if (ts < tz->trans[i]) {
                        *transition_time = tz->trans[i - 1];
index 7f8e7b675c53f1a5275f5a98fca541978afef249..d037e6dc35ba474e4a78add431db5cb345da03b7 100644 (file)
@@ -106,8 +106,8 @@ result=Tuesday 2005-04-12 00:00:00 CDT 1
 wanted=Tuesday            00:00:00
 
 TZ=Pacific/Pitcairn - wrong day.
-tStamp=Thursday 1970-01-01 17:17:17 PST 0
-result=Wednesday 1970-01-06 00:00:00 PST 0
+tStamp=Thursday 1970-01-01 17:17:17 PNT 0
+result=Wednesday 1970-01-07 00:00:00 PNT 0
 wanted=Wednesday            00:00:00
 
 TZ=Pacific/Fakaofo - wrong day.