#46111 [Ver->Asn]: strtotime() returns false for some valid timezones

From: Date: Wed, 27 Jan 2010 14:10:20 +0000
Subject: #46111 [Ver->Asn]: strtotime() returns false for some valid timezones
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-146995@lists.php.net to get a copy of this message
ID: 46111 Updated by: derick@php.net 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] jani@php.net 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

« previous php.bugs (#146995) next »