Req #70701 [Opn]: Add support for seconds in timezone offset

From: Date: Mon, 12 Oct 2015 23:04:16 +0000
Subject: Req #70701 [Opn]: Add support for seconds in timezone offset
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-196579@lists.php.net to get a copy of this message
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


Thread (7 messages)

« previous php.bugs (#196579) next »