derick Sat Jun 18 15:23:59 2005 EDT Modified files: /php-src/ext/date/lib parse_tz.c timelib_structs.h tm2unixtime.c Log: - Fixed bug in tm2unixtime where the wanted date was in the transition time between two zones. #- In this case the wanted date actually didn't exist, and that wasn't # handled correctly. http://cvs.php.net/diff.php/php-src/ext/date/lib/parse_tz.c?r1=1.11&r2=1.12&ty=u Index: php-src/ext/date/lib/parse_tz.c diff -u php-src/ext/date/lib/parse_tz.c:1.11 php-src/ext/date/lib/parse_tz.c:1.12 --- php-src/ext/date/lib/parse_tz.c:1.11 Sat Jun 18 07:58:18 2005 +++ php-src/ext/date/lib/parse_tz.c Sat Jun 18 15:23:58 2005 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: parse_tz.c,v 1.11 2005/06/18 11:58:18 derick Exp $ */ +/* $Id: parse_tz.c,v 1.12 2005/06/18 19:23:58 derick Exp $ */ #include <timelib_config.h> @@ -220,7 +220,7 @@ return tmp; } -static ttinfo* fetch_timezone_offset(timelib_tzinfo *tz, timelib_sll ts) +static ttinfo* fetch_timezone_offset(timelib_tzinfo *tz, timelib_sll ts, timelib_sll *transition_time) { uint32_t i; @@ -229,13 +229,16 @@ } if (ts < tz->trans[0]) { + *transition_time = 0; return &(tz->type[tz->trans_idx[tz->timecnt - 1]]); } for (i = 0; i < tz->timecnt; i++) { if (ts < tz->trans[i]) { + *transition_time = tz->trans[i - 1]; return &(tz->type[tz->trans_idx[i - 1]]); } } + *transition_time = tz->trans[tz->timecnt - 1]; return &(tz->type[tz->trans_idx[tz->timecnt - 1]]); } @@ -258,7 +261,9 @@ int timelib_timestamp_is_in_dst(timelib_sll ts, timelib_tzinfo *tz) { ttinfo *to; - if ((to = fetch_timezone_offset(tz, ts))) { + timelib_sll dummy; + + if ((to = fetch_timezone_offset(tz, ts, &dummy))) { return to->isdst; } return -1; @@ -271,14 +276,17 @@ int32_t offset = 0, leap_secs = 0; char *abbr; timelib_time_offset *tmp = timelib_time_offset_ctor(); + timelib_sll transistion_time; - if ((to = fetch_timezone_offset(tz, ts))) { + if ((to = fetch_timezone_offset(tz, ts, &transistion_time))) { offset = to->offset; abbr = &(tz->timezone_abbr[to->abbr_idx]); tmp->is_dst = to->isdst; + tmp->transistion_time = transistion_time; } else { abbr = tz->timezone_abbr; tmp->is_dst = 0; + tmp->transistion_time = 0; } if ((tl = fetch_leaptime_offset(tz, ts))) { http://cvs.php.net/diff.php/php-src/ext/date/lib/timelib_structs.h?r1=1.8&r2=1.9&ty=u Index: php-src/ext/date/lib/timelib_structs.h diff -u php-src/ext/date/lib/timelib_structs.h:1.8 php-src/ext/date/lib/timelib_structs.h:1.9 --- php-src/ext/date/lib/timelib_structs.h:1.8 Fri Jun 17 10:54:00 2005 +++ php-src/ext/date/lib/timelib_structs.h Sat Jun 18 15:23:58 2005 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: timelib_structs.h,v 1.8 2005/06/17 14:54:00 derick Exp $ */ +/* $Id: timelib_structs.h,v 1.9 2005/06/18 19:23:58 derick Exp $ */ #ifndef __TIMELIB_STRUCTS_H__ #define __TIMELIB_STRUCTS_H__ @@ -119,6 +119,7 @@ unsigned int leap_secs; unsigned int is_dst; char *abbr; + timelib_sll transistion_time; } timelib_time_offset; typedef struct timelib_time { http://cvs.php.net/diff.php/php-src/ext/date/lib/tm2unixtime.c?r1=1.9&r2=1.10&ty=u Index: php-src/ext/date/lib/tm2unixtime.c diff -u php-src/ext/date/lib/tm2unixtime.c:1.9 php-src/ext/date/lib/tm2unixtime.c:1.10 --- php-src/ext/date/lib/tm2unixtime.c:1.9 Fri Jun 17 10:54:00 2005 +++ php-src/ext/date/lib/tm2unixtime.c Sat Jun 18 15:23:58 2005 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: tm2unixtime.c,v 1.9 2005/06/17 14:54:00 derick Exp $ */ +/* $Id: tm2unixtime.c,v 1.10 2005/06/18 19:23:58 derick Exp $ */ #include <timelib_config.h> #include "timelib.h" @@ -209,14 +209,21 @@ /* No timezone in struct, fallback to reference if possible */ if (tzi) { timelib_time_offset *before, *after; - timelib_sll tmp; + timelib_sll tmp; + int in_transistion; tz->is_localtime = 1; before = timelib_get_time_zone_info(tz->sse, tzi); after = timelib_get_time_zone_info(tz->sse - before->offset, tzi); timelib_set_timezone(tz, tzi); - if (before->is_dst != after->is_dst) { - tmp = -tz->z + (before->offset - after->offset); + + in_transistion = ( + ((tz->sse - after->offset) >= (after->transistion_time + (before->offset - after->offset))) && + ((tz->sse - after->offset) < after->transistion_time) + ); + + if ((before->offset != after->offset) && !in_transistion) { + tmp = -after->offset; } else { tmp = -tz->z; }
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php