Req #53831 [Com]: DateInterval constructor does not handle valid ISO 8601 strings

From: Date: Wed, 12 Oct 2011 16:09:31 +0000
Subject: Req #53831 [Com]: DateInterval constructor does not handle valid ISO 8601 strings
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-164260@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=53831&edit=1

 ID:                 53831
 Comment by:         dagguh at gmail dot com
 Reported by:        pallinger at dsd dot sztaki dot hu
 Summary:            DateInterval constructor does not handle valid ISO
                     8601 strings
 Status:             Open
 Type:               Feature/Change Request
 Package:            Date/time related
 Operating System:   ubuntu linux 10.10
 PHP Version:        5.3.5
 Block user comment: N
 Private report:     N

 New Comment:

http://en.wikipedia.org/wiki/Iso8601#Durations

This decimal fraction may be specified with either a comma or a full stop, as in 
"P0,5Y" or "P0.5Y".

Remember to accept both comma and a full stop.


Previous Comments:
------------------------------------------------------------------------
[2011-01-24 18:41:19] pallinger at dsd dot sztaki dot hu

Description:
------------
---
From manual page: http://www.php.net/dateinterval.construct
---
The documentation says that "Each duration period is represented by an integer value followed
by a period designator.", however, the ISO 8601 allows non-integer values for the last number
(http://en.wikipedia.org/wiki/ISO_8601#Durations).
This is quite important if I want to parse XML data which contains millisecond-precision durations,
as the seconds will surely not be integers.

Test script:
---------------
<?php 
   var_dump(new DateInterval('PT1.1S'));
?>

Expected result:
----------------
Should print out a valid DateInterval object, eg.:
object(DateInterval)#1 (8) {
  ["y"]=>
  int(0)
  ["m"]=>
  int(0)
  ["d"]=>
  int(0)
  ["h"]=>
  int(0)
  ["i"]=>
  int(0)
  ["s"]=>
  float(1.1)
  ["invert"]=>
  int(0)
  ["days"]=>
  bool(false)
}
It could also include a millisecond/microsecond/nanosecond field to accomodate additional precision.
However, if the durations that are stored are still integers, it would be difficult to handle
durations like "P0.5Y".

Actual result:
--------------
PHP Fatal error:  Uncaught exception 'Exception' with message
'DateInterval::__construct(): Unknown or bad format (PT1.1S)' in -:1
Stack trace:
#0 -(1): DateInterval->__construct('PT1.1S')
#1 {main}
  thrown in - on line 1



------------------------------------------------------------------------



-- 
Edit this bug report at https://bugs.php.net/bug.php?id=53831&edit=1


Thread (13 messages)

« previous php.bugs (#164260) next »