php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #46111 strtotime() returns false for some valid timezones
Submitted: 2008-09-18 06:01 UTC Modified: 2010-03-07 20:18 UTC
From: jason at eventshop dot com dot au Assigned: derick (profile)
Status: Closed Package: Date/time related
PHP Version: 5.*, 6CVS (2009-05-10) OS: *
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: jason at eventshop dot com dot au
New email:
PHP Version: OS:

 

 [2008-09-18 06:01 UTC] 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

Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2009-05-10 21:19 UTC] jani@php.net
The list is a bit shorter with PHP_5_3 than with PHP_5_2..some progress? 
:)
 [2010-01-21 14:00 UTC] 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";
 [2010-01-27 12:49 UTC] 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-27 14:10 UTC] derick@php.net
Thanks! I should have some time next week to look at your patches (and comments).
 [2010-03-07 20:18 UTC] derick@php.net
Automatic comment from SVN on behalf of derick
Revision: http://svn.php.net/viewvc/?view=revision&amp;revision=295940
Log: - Fixed bug #46111 (Some timezone identifiers can not be parsed).
 [2010-03-07 20:18 UTC] derick@php.net
-Status: Assigned +Status: Closed
 [2010-03-07 20:18 UTC] derick@php.net
This bug has been fixed in SVN.

Snapshots of the sources are packaged every three hours; this change
will be in the next snapshot. You can grab the snapshot at
http://snaps.php.net/.
 
Thank you for the report, and for helping us make PHP better.


 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Sat Nov 23 10:01:28 2024 UTC