ID:               44780
 Comment by:       mfburdett at gmail dot com
 Reported By:      shawn dot parker at alttech dot com
 Status:           Assigned
 Bug Type:         Date/time related
 Operating System: *
 PHP Version:      5CVS-2008-08-14
 Assigned To:      derick
 New Comment:

I was able to resolve this by changing the fallbackmap from hours to
minutes (the bug is apparently due to some issue with float vs.
integer).  Also, this patch adds Caracas and Shanghai time (there are
likely other missing time zones, however) and uses the new spelling for
Calcutta (Kolkata).

Index: ext/date/lib/fallbackmap.h
===================================================================
RCS file: /repository/php-src/ext/date/lib/fallbackmap.h,v
retrieving revision 1.3
diff -u -p -r1.3 fallbackmap.h
--- ext/date/lib/fallbackmap.h  15 Oct 2005 18:14:40 -0000      1.3
+++ ext/date/lib/fallbackmap.h  8 May 2009 18:18:32 -0000
@@ -1,40 +1,42 @@
-       { "sst",   0,  -11,  "Pacific/Apia" },
-       { "hst",   0,  -10,  "Pacific/Honolulu" },
-       { "akst",  0,   -9,  "America/Anchorage" },
-       { "akdt",  1,   -8,  "America/Anchorage" },
-       { "pst",   0,   -8,  "America/Los_Angeles" },
-       { "pdt",   1,   -7,  "America/Los_Angeles" },
-       { "mst",   0,   -7,  "America/Denver" },
-       { "mdt",   1,   -6,  "America/Denver" },
-       { "cst",   0,   -6,  "America/Chicago" },
-       { "cdt",   1,   -5,  "America/Chicago" },
-       { "est",   0,   -5,  "America/New_York" },
-       { "edt",   1,   -4,  "America/New_York" },
-       { "ast",   0,   -4,  "America/Halifax" },
-       { "adt",   1,   -3,  "America/Halifax" },
-       { "brt",   0,   -3,  "America/Sao_Paulo" },
-       { "brst",  1,   -2,  "America/Sao_Paulo" },
-       { "azost", 0,   -1,  "Atlantic/Azores" },
-       { "azodt", 1,    0,  "Atlantic/Azores" },
-       { "gmt",   0,    0,  "Europe/London" },
-       { "bst",   1,    1,  "Europe/London" },
-       { "cet",   0,    1,  "Europe/Paris" },
-       { "cest",  1,    2,  "Europe/Paris" },
-       { "eet",   0,    2,  "Europe/Helsinki" },
-       { "eest",  1,    3,  "Europe/Helsinki" },
-       { "msk",   0,    3,  "Europe/Moscow" },
-       { "msd",   1,    4,  "Europe/Moscow" },
-       { "gst",   0,    4,  "Asia/Dubai" },
-       { "pkt",   0,    5,  "Asia/Karachi" },
-       { "ist",   0,  5.5,  "Asia/Calcutta" },
-       { "npt",   0, 5.75,  "Asia/Katmandu" },
-       { "yekt",  1,    6,  "Asia/Yekaterinburg" },
-       { "novst", 1,    7,  "Asia/Novosibirsk" },
-       { "krat",  0,    7,  "Asia/Krasnoyarsk" },
-       { "krast", 1,    8,  "Asia/Krasnoyarsk" },
-       { "jst",   0,    9,  "Asia/Tokyo" },
-       { "est",   0,   10,  "Australia/Melbourne" },
-       { "cst",   1, 10.5,  "Australia/Adelaide" },
-       { "est",   1,   11,  "Australia/Melbourne" },
-       { "nzst",  0,   12,  "Pacific/Auckland" },
-       { "nzdt",  1,   13,  "Pacific/Auckland" },
+       { "sst",   0, -660, "Pacific/Apia" },
+       { "hst",   0, -600, "Pacific/Honolulu" },
+       { "akst",  0, -540, "America/Anchorage" },
+       { "akdt",  1, -480, "America/Anchorage" },
+       { "pst",   0, -480, "America/Los_Angeles" },
+       { "pdt",   1, -420, "America/Los_Angeles" },
+       { "mst",   0, -420, "America/Denver" },
+       { "mdt",   1, -360, "America/Denver" },
+       { "cst",   0, -360, "America/Chicago" },
+       { "cdt",   1, -300, "America/Chicago" },
+       { "est",   0, -300, "America/New_York" },
+       { "vet",   0, -270, "America/Caracas" },
+       { "edt",   1, -240, "America/New_York" },
+       { "ast",   0, -240, "America/Halifax" },
+       { "adt",   1, -180, "America/Halifax" },
+       { "brt",   0, -180, "America/Sao_Paulo" },
+       { "brst",  1, -120, "America/Sao_Paulo" },
+       { "azost", 0,  -60, "Atlantic/Azores" },
+       { "azodt", 1,    0, "Atlantic/Azores" },
+       { "gmt",   0,    0, "Europe/London" },
+       { "bst",   1,   60, "Europe/London" },
+       { "cet",   0,   60, "Europe/Paris" },
+       { "cest",  1,  120, "Europe/Paris" },
+       { "eet",   0,  120, "Europe/Helsinki" },
+       { "eest",  1,  180, "Europe/Helsinki" },
+       { "msk",   0,  180, "Europe/Moscow" },
+       { "msd",   1,  240, "Europe/Moscow" },
+       { "gst",   0,  240, "Asia/Dubai" },
+       { "pkt",   0,  300, "Asia/Karachi" },
+       { "ist",   0,  330, "Asia/Kolkata" },
+       { "npt",   0,  345, "Asia/Katmandu" },
+       { "yekt",  1,  360, "Asia/Yekaterinburg" },
+       { "novst", 1,  420, "Asia/Novosibirsk" },
+       { "krat",  0,  420, "Asia/Krasnoyarsk" },
+       { "cst",   0,  480, "Asia/Shanghai" },
+       { "krast", 1,  480, "Asia/Krasnoyarsk" },
+       { "jst",   0,  540, "Asia/Tokyo" },
+       { "est",   0,  600, "Australia/Melbourne" },
+       { "cst",   1,  630, "Australia/Adelaide" },
+       { "est",   1,  660, "Australia/Melbourne" },
+       { "nzst",  0,  720, "Pacific/Auckland" },
+       { "nzdt",  1,  780, "Pacific/Auckland" },
Index: ext/date/lib/parse_date.c
===================================================================
RCS file: /repository/php-src/ext/date/lib/parse_date.c,v
retrieving revision 1.102
diff -u -p -r1.102 parse_date.c
--- ext/date/lib/parse_date.c   10 Mar 2009 23:39:11 -0000      1.102
+++ ext/date/lib/parse_date.c   8 May 2009 18:18:32 -0000
@@ -719,7 +719,7 @@ const static timelib_tz_lookup_table* zo
        /* Still didn't find anything, let's find the zone solely based on
         * offset/isdst then */
        for (fmp = timelib_timezone_fallbackmap; fmp->name; fmp++) {
-               if ((fmp->gmtoffset * 3600) == gmtoffset && fmp->type == isdst) 
{
+               if ((fmp->gmtoffset * 60) == gmtoffset && fmp->type == isdst) {
                        return fmp;
                }
        }
Index: ext/date/lib/parse_date.re
===================================================================
RCS file: /repository/php-src/ext/date/lib/parse_date.re,v
retrieving revision 1.92
diff -u -p -r1.92 parse_date.re
--- ext/date/lib/parse_date.re  18 Dec 2008 14:54:51 -0000      1.92
+++ ext/date/lib/parse_date.re  8 May 2009 18:18:32 -0000
@@ -717,7 +717,7 @@ const static timelib_tz_lookup_table* zo
        /* Still didn't find anything, let's find the zone solely based on
         * offset/isdst then */
        for (fmp = timelib_timezone_fallbackmap; fmp->name; fmp++) {
-               if ((fmp->gmtoffset * 3600) == gmtoffset && fmp->type == isdst) 
{
+               if ((fmp->gmtoffset * 60) == gmtoffset && fmp->type == isdst) {
                        return fmp;
                }
        }


Previous Comments:
------------------------------------------------------------------------

[2008-11-07 18:13:38] mfburdett at gmail dot com

The originally filed reproduce code
var_dump( timezone_name_from_abbr('',-36000,1) );
and expected result 'Pacific/Honolulu' are not actually valid because
Honolulu does not observe daylight saving time.  See comments above for
what look like actual bugs.

------------------------------------------------------------------------

[2008-11-07 17:33:44] mfburdett at gmail dot com

The affected population sizes of the two issues may be similar after
all: China standard time is missing from the fallbackmap (offset 8
hours, daylight saving time 0).

------------------------------------------------------------------------

[2008-11-07 17:25:33] mfburdett at gmail dot com

Looking at
http://cvs.php.net/viewvc.cgi/php-src/ext/date/lib/fallbackmap.h?revision=1.3&view=markup
it appears to be a simple bug: lookups of the fallbackmap are not
working for any of the time zones with non-integer offsets.  A more
minor issue (in terms of affected population size) is that some valid
offsets are missing from the fallbackmap.

------------------------------------------------------------------------

[2008-11-06 20:22:31] mfburdett at gmail dot com

Note some of the above abbreviations are obsolete, e.g. BURT has been
replaced with MMT.  But the point is timezone_name_from_abbr() does not
work for those offsets without an abbreviation.

------------------------------------------------------------------------

[2008-11-06 18:27:36] jjkd at jjkd dot com

In my testing, this is the list of offsets that do not work for PHP
5.2.6:

-34200, ckhst
-16200, ant
-12600, negt
-7200, addt
12600, irst
16200, aft
19800, ist
20700, npt
21600, aktst
23400, burt
28800, bnt
34200, cast
35100, cwst
37800, cst
39600, anat
41400, lhst
46800, anast
49500, chadt
50400, anast

------------------------------------------------------------------------

The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
    http://bugs.php.net/44780

-- 
Edit this bug report at http://bugs.php.net/?id=44780&edit=1

Reply via email to