Edit report at https://bugs.php.net/bug.php?id=70701&edit=1
ID: 70701
User updated by: p at wspnr dot com
Reported by: p at wspnr dot com
Summary: Add support for seconds in timezone offset
Status: Open
Type: Feature/Change Request
Package: Date/time related
Operating System: All
PHP Version: 7.0.0RC4
Block user comment: N
Private report: N
New Comment:
I had the same thought when it came up in testing, as it is not documented in the PostgreSQL docs.
It seems to be some sort of fallback for ranges where PostgreSQL can't find the timezone data.
SELECT make_timestamptz(1895, 9, 15, 5, 30, 0.00, '-05:30:00');
=> "1895-09-15 06:00:00-05"
SELECT make_timestamptz(1894, 9, 15, 5, 30, 0.00, '-05:30:00');
=> "1894-09-15 05:42:28-05:17:32"
The problem arose because our testers entered '1111-11-11 11:11:11' as the date and time.
PostgreSQL does this:
SELECT make_timestamptz(1111, 1, 11, 11, 11, 11.00, 'UTC');
=> "1111-11-11 05:53:39-05:17:32"
Tracing this further, it seems that PostgreSQL falls back to the system timezone if it can't
make sense of the input. By default, the system timezone is 'localtime', which is
equivalent to the entry in the zoneinfo database.
The zoneinfo database does express offsets with second precision:
Zone America/Toronto -5:17:32 - LMT 1895
Previous Comments:
------------------------------------------------------------------------
[2015-10-12 22:26:30] rasmus@php.net
But we don't have any timezones on this planet that has an offset that needs second
granularity, do we? I wonder what the use case for this is in PostgreSQL?
------------------------------------------------------------------------
[2015-10-12 22:23:39] p at wspnr dot com
Description:
------------
The \DateTime and \DateTimeImmutable classes correctly handle timezone offsets of the format
"-05" (hours) and "-05:30" (hours and minutes), but NOT "-05:30:30"
(hours, minutes and seconds).
Given that the "Z" format code is available, presumably timezone offsets at this level of
precision are supported.
The use case for this is interoperability with other applications. For instance, a timestamptz field
in PostgreSQL 9.4 can have timezone offsets of this format.
Test script:
---------------
<?php
$dt1 = new \DateTime("2015-09-15 01:15-05:30");
echo $dt1->format("Y-m-d\TH:i:s.uZ");
$dt2 = new \DateTime("2015-09-15 01:15-05:30:30");
echo $dt2->format("Y-m-d\TH:i:s.uZ");
Expected result:
----------------
2015-09-15T01:15:00.000000-19800
2015-09-15T01:15:00.000000-19830
Actual result:
--------------
2015-09-15T01:15:00.000000-19800
Fatal error: Uncaught Exception: DateTime::__construct(): Failed to parse time string (2015-09-15
01:15-05:30:30) at position 22 (:): Unexpected character in /.../file.php
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=70701&edit=1