ID:               46111
 Updated by:       [email protected]
 Reported By:      jason at eventshop dot com dot au
-Status:           Verified
+Status:           Assigned
 Bug Type:         Date/time related
 Operating System: *
 PHP Version:      5.*, 6CVS (2009-05-10)
-Assigned To:      
+Assigned To:      derick
 New Comment:

Thanks! I should have some time next week to look at your patches (and
comments).


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

[2010-01-27 12:49:37] yoarvi at gmail dot com

Test case:

Index: ext/date/tests/bug46111.phpt
===================================================================
--- ext/date/tests/bug46111.phpt        (revision 0)
+++ ext/date/tests/bug46111.phpt        (revision 0)
@@ -0,0 +1,23 @@
+--TEST--
+Bug #46111 (strtotime() returns false for some valid timezones)
+--FILE--
+<?php
+date_default_timezone_set('Asia/Calcutta');
+$timezones = timezone_identifiers_list();
+
+# An empty list indicates no errors
+print "[strtotime(timezone) == false - Begin List]\n";
+foreach ($timezones as $zone) {
+       $date_string = "2008-01-01 13:00:00 " . $zone;
+       
+       if (!strtotime($date_string)) {
+               echo $zone . "\n";
+       }
+}
+print "[strtotime(timezone) == false - End List]\n";
+?>
+--EXPECT--
+[strtotime(timezone) == false - Begin List]
+[strtotime(timezone) == false - End List]
+

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

[2010-01-21 14:00:59] yoarvi at gmail dot com

The failures in PHP 5.3 are the following:
Africa/Dar_es_Salaam
Africa/Porto-Novo
America/Blanc-Sablon
America/Port-au-Prince
America/Port_of_Spain
Antarctica/DumontDUrville
Antarctica/McMurdo

The regex for tz in parse_date.re doesn't account for hyphens, or for
lower-case following an _ or for consecutive upper case letters.

Applying the following patch and regenerating parse_date.c fixes the
problem:

Index: ext/date/lib/parse_date.re
===================================================================
--- ext/date/lib/parse_date.re  (revision 293574)
+++ ext/date/lib/parse_date.re  (working copy)
@@ -854,7 +854,7 @@
 second = minute | "60";
 secondlz = minutelz | "60";
 meridian = ([AaPp] "."? [Mm] "."?) [\000\t ];
-tz = "("? [A-Za-z]{1,6} ")"? | [A-Z][a-z]+([_/][A-Z][a-z]+)+;
+tz = "("? [A-Za-z]{1,6} ")"? | [A-Z][a-z]+([_/-][A-Za-z]+)+;
 tzcorrection = "GMT"? [+-] hour24 ":"? minute?;
 
 daysuf = "st" | "nd" | "rd" | "th";

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

[2009-05-10 21:19:37] [email protected]

The list is a bit shorter with PHP_5_3 than with PHP_5_2..some
progress? 
:)

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

[2008-09-18 06:01:34] jason at eventshop dot com dot au

Description:
------------
When converting a date/time/timezone string using strtotime(), it
returns false for several of the supposedly valid timezones, such as
"Adelaide/ACT", "Israel", "US/Arizona", etc.

All other timezones work correctly.

Reproduce code:
---------------
$timezones = timezone_identifiers_list();

foreach ($timezones as $zone) {
        $date_string = "2008-01-01 13:00:00 " . $zone;
        
        if (!strtotime($date_string)) {
                echo "<br />"  . $zone;
        }
}

Expected result:
----------------
No result should be displayed.

Actual result:
--------------
Africa/Dar_es_Salaam
Africa/Porto-Novo
America/Argentina/ComodRivadavia
America/Blanc-Sablon
... etc ...
US/Pacific
US/Pacific-New
US/Samoa
W-SU
Zulu


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


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

Reply via email to