Edit report at https://bugs.php.net/bug.php?id=51950&edit=1
ID: 51950
Comment by: xrypak at gmail dot com
Reported by: jmf at durcommefaire dot net
Summary: DateTime does not handle decimal fractions of ISO
8601 format
Status: Not a bug
Type: Bug
Package: Date/time related
Operating System: Ubuntu 10.04
PHP Version: 5.3.2
Assigned To: cmb
Block user comment: N
Private report: N
New Comment:
Sorry, this seems to be known issue.
Using DATE_ATOM / DateTimeInterface::ATOM will work for ISO 8601 string NOT containing decimal
parts.
It does NOT work for strings with decimal parts, though.
Previous Comments:
------------------------------------------------------------------------
[2022-09-13 10:10:56] xrypak at gmail dot com
Here a value from [the documentation](https://www.php.net/manual/en/datetime.format.php) is used:
$value = '2004-02-12T15:19:21+00:00';
$dt = new DateTime($value);
$formatted = $dt->format('c');
$date = \DateTime::createFromFormat('c', $formatted);
$errors = \DateTime::getLastErrors();
Now, this produces the following errors:
- The format separator does not match
- Trailing data
This is funny, because value equals the formatted value ????ââï¸.
$formatted === $value // TRUE
Why can't we parse the value PHP itself outputs?
------------------------------------------------------------------------
[2021-03-16 07:19:17] hooby404 at gmail dot com
For anyone reading this:
DateTime::ATOM / DATE_ATOM suffers from exactly the same problem, and there's currently (as of
PHP 8.0) no easy way to correctly handle milliseconds with built-in PHP functions.
If you want to read the ISO 8601 format as produced by Javascript's Date.toJSON() in PHP, you
have to rely on third party tools.
I recommend this one: https://carbon.nesbot.com/
------------------------------------------------------------------------
[2019-07-16 09:25:56] cmb@php.net
> PHP is told to parse a valid ISO8601 date
No. It is told to use the DateTime::ISO8601 format,
and the docs[1] state:
| This format is not compatible with ISO-8601, but is left this
| way for backward compatibility reasons. Use DateTime::ATOM or
| DATE_ATOM for compatibility with ISO-8601 instead.
If you think DateTime::ISO8601 should be changed for PHP 8, please
pursue the RFC process[2].
[1] <https://www.php.net/manual/en/class.datetimeinterface.php#datetime.constants.iso8601>
[2] <https://wiki.php.net/rfc/howto>
------------------------------------------------------------------------
[2019-07-16 08:59:29] divinity76 at gmail dot com
@CMB you're wrong imo. in the sample code provided, PHP is told to parse a valid ISO8601 date,
and PHP fails to do so. that's a bug in my eyes. please explain how this is not a bug, is PHP
not supposed to parse a ISO8601 date when told to do so?
------------------------------------------------------------------------
[2018-12-05 13:40:25] christophe at gosiau dot be
I would like to refer to this Wikipedia article:
https://en.wikipedia.org/wiki/ISO_8601
It states:
A decimal mark, either a comma or a dot (without any preference as stated in resolution 10 of the
22nd General Conference CGPM in 2003,[14] but with a preference for a comma according to ISO
8601:2004)[15] is used as a separator between the time element and its fraction.
------------------------------------------------------------------------
The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
https://bugs.php.net/bug.php?id=51950
--
Edit this bug report at https://bugs.php.net/bug.php?id=51950&edit=1