PHP 5.5.10 timezone handling changes
PHP 5.5.10 got released a few weeks ago, and among other things, it added some new functionality related to timezone handling.
In short, this is now works:
$tz = new DateTimeZone('UTC-05:00');
Normally this would not be recommended, as you really should specify timezones based on their geographical location. This information is not always available though, so it’s a welcome new feature.
The sabre/vobject project is a heavy user of timezone-related features, and unfortunately this introduced a few subtle bugs.
UTC vs. GMT
Before PHP 5.5.10, this code:
$tz = new DateTimeZone('GMT'); echo $tz->getName();
GMT no longer automatically gets converted to
UTC, and the same
script will now output
GMT are very similar, and in most
practical situation interchangeable. (but not all).
If you relied before on figuring out wether a time is in
UTC, be careful,
because you may have to change this to
Some timezone ids are now invalid
There’s quite a bit of weird timezones on the Other page on php.net. Even though these are not recommended to be used, we still need them as people may generate timezone ids from that list, which we need to understand and parse.
Since PHP 5.5.10, the following timezone identifiers from that list now throw errors:
CST6CDT Cuba Egypt Eire EST5EDT Factory GB-Eire GMT0 Greenwich Hongkong Iceland Iran Israel Jamaica Japan Kwajalein Libya MST7MDT Navajo NZ-CHAT Poland Portugal PST8PDT Singapore Turkey Universal W-SU
This was reported as bug #66985.
Handling of some incorrect timezone names
The vobject library relies on exceptions to be thrown when constructing the
DateTimeZone object. When this happens, a fallback behaviour kicks in that
attempts to guess the correct timezone.
Microsoft often throws us timezones such as this:
This now automatically gets picked up as the ‘+01:00’ timezone by
DateTimeZone, so as of PHP 5.5.10 the fallback behavior no longer kicks in,
and we’re no longer returning `Europe/Sarajevo’.