php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #51975 Missing DST free (UTC±X) timezones in DateTimeZone::listIdentifiers()
Submitted: 2010-06-02 15:27 UTC Modified: 2010-06-02 19:23 UTC
From: V-o-E at gmx dot de Assigned:
Status: Not a bug Package: Date/time related
PHP Version: 5.3.2 OS: All
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: V-o-E at gmx dot de
New email:
PHP Version: OS:

 

 [2010-06-02 15:27 UTC] V-o-E at gmx dot de
Description:
------------
There are not daylight saving time free timezones (UTC±X) in DateTimeZone::listIdentifiers() (same with DateTimeZone::ALL) except UTC±0.

As workaround i can use buggy "Etc/GMT±X" from DateTimeZone::listIdentifiers(DateTimeZone::ALL_WITH_BC):

Etc/GMT+2 => Etc/GMT-2
Etc/GMT-2 => Etc/GMT+2

See: http://en.wikipedia.org/wiki/List_of_time_zones_by_UTC_offset


Test script:
---------------
var_dump(DateTimeZone::listIdentifiers(DateTimeZone::ALL_WITH_BC));

var_dump(DateTimeZone::listIdentifiers());

$a = DateTimeZone::listIdentifiers(DateTimeZone::ALL_WITH_BC);
var_dump($a[373]); // output: string(9) "Etc/GMT+2"

$b = DateTimeZone::listIdentifiers();
var_dump($b[373]); // output: string(15) "Pacific/Fakaofo"

date_default_timezone_set('UTC');
echo date('H:i:s') . "\n"; // output: 13:13:01

date_default_timezone_set('Etc/GMT+2');
echo date('H:i:s') . "\n"; // output: 11:13:01

date_default_timezone_set('Etc/GMT-2');
echo date('H:i:s') . "\n"; // output: 15:13:01

date_default_timezone_set('Pacific/Fakaofo');
echo date('H:i:s') . "\n"; // output: 01:13:01

Expected result:
----------------
array(564) {
...
}
array(xyz) {
...
  [405]=>
  string(3) "UTC"
  [406]=>
  string(3) "UTC-12"
  [407]=>
  string(3) "UTC-11"
...
}
string(9) "Pacific/Fakaofo"
string(15) "Pacific/Fakaofo"
13:16:08
15:16:08
11:16:08
03:16:08

Actual result:
--------------
array(564) {
...
}
array(406) {
...
  [405]=>
  string(3) "UTC"
}
string(9) "Etc/GMT+2"
string(15) "Pacific/Fakaofo"
13:16:08
11:16:08
15:16:08
03:16:08

Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2010-06-02 15:41 UTC] aharvey@php.net
-Status: Open +Status: Bogus
 [2010-06-02 15:41 UTC] aharvey@php.net
The Olson tz database -- which forms the basis of the time zone support both for PHP and pretty much every operating system not called Windows -- doesn't define any time zones relative to UTC other than the Etc/GMT±x time zones and the UTC time zone itself.

The Etc/GMT time zones are the "wrong way around", but that's been the case for decades, and isn't something we (or probably anyone else) can fix without confusing people even more.
 [2010-06-02 19:23 UTC] V-o-E at gmx dot de
oh, i see.

# We use POSIX-style signs in the Zone names and the output abbreviations,
# even though this is the opposite of what many people expect.
# POSIX has positive signs west of Greenwich, but many people expect
# positive signs east of Greenwich.  For example, TZ='Etc/GMT+4' uses
# the abbreviation "GMT+4" and corresponds to 4 hours behind UTC
# (i.e. west of Greenwich) even though many people would expect it to
# mean 4 hours ahead of UTC (i.e. east of Greenwich).
#
# In the draft 5 of POSIX 1003.1-200x, the angle bracket notation
# (which is not yet supported by the tz code) allows for
# TZ='<GMT-4>+4'; if you want time zone abbreviations conforming to
# ISO 8601 you can use TZ='<-0400>+4'.  Thus the commonly-expected
# offset is kept within the angle bracket (and is used for display)
# while the POSIX sign is kept outside the angle bracket (and is used
# for calculation).
#
# Do not use a TZ setting like TZ='GMT+4', which is four hours behind
# GMT but uses the completely misleading abbreviation "GMT".

# Earlier incarnations of this package were not POSIX-compliant,
# and had lines such as
#		Zone	GMT-12		-12	-	GMT-1200
# We did not want things to change quietly if someone accustomed to the old
# way does a
#		zic -l GMT-12
# so we moved the names into the Etc subdirectory.

Zone	Etc/GMT-14	14	-	GMT-14	# 14 hours ahead of GMT
Zone	Etc/GMT-13	13	-	GMT-13
Zone	Etc/GMT-12	12	-	GMT-12
Zone	Etc/GMT-11	11	-	GMT-11
Zone	Etc/GMT-10	10	-	GMT-10
Zone	Etc/GMT-9	9	-	GMT-9
Zone	Etc/GMT-8	8	-	GMT-8
Zone	Etc/GMT-7	7	-	GMT-7
Zone	Etc/GMT-6	6	-	GMT-6
Zone	Etc/GMT-5	5	-	GMT-5
Zone	Etc/GMT-4	4	-	GMT-4
Zone	Etc/GMT-3	3	-	GMT-3
Zone	Etc/GMT-2	2	-	GMT-2
Zone	Etc/GMT-1	1	-	GMT-1
Zone	Etc/GMT+1	-1	-	GMT+1
Zone	Etc/GMT+2	-2	-	GMT+2
Zone	Etc/GMT+3	-3	-	GMT+3
Zone	Etc/GMT+4	-4	-	GMT+4
Zone	Etc/GMT+5	-5	-	GMT+5
Zone	Etc/GMT+6	-6	-	GMT+6
Zone	Etc/GMT+7	-7	-	GMT+7
Zone	Etc/GMT+8	-8	-	GMT+8
Zone	Etc/GMT+9	-9	-	GMT+9
Zone	Etc/GMT+10	-10	-	GMT+10
Zone	Etc/GMT+11	-11	-	GMT+11
Zone	Etc/GMT+12	-12	-	GMT+12

This is output of "etcetera" file from "Olson tz database".
It is not deprecated, isn't it?

This are the "Etc*" zones from "backward" file:
Link	Etc/GMT			GMT+0
Link	Etc/GMT			GMT-0
Link	Etc/GMT			GMT0
Link	Etc/GMT			Greenwich
Link	Etc/UCT			UCT
Link	Etc/UTC			UTC
Link	Etc/UTC			Universal
Link	Etc/UTC			Zulu

So i think the "Etc/GMT±x" timezones from "etcetera" should be in output of:
DateTimeZone::listIdentifiers()
DateTimeZone::listIdentifiers(DateTimeZone::ALL)
DateTimeZone::listIdentifiers(DateTimeZone::UTC)

and not only in:
DateTimeZone::listIdentifiers(DateTimeZone::ALL_WITH_BC)

what is your opinion?
 
PHP Copyright © 2001-2025 The PHP Group
All rights reserved.
Last updated: Thu Sep 18 11:00:01 2025 UTC