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:
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?
Previous Comments:
------------------------------------------------------------------------
[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.
------------------------------------------------------------------------
[2016-08-07 14:51:18] cmb@php.net
Thank you for taking the time to write to us, but this is not
a bug. Please double-check the documentation available at
http://www.php.net/manual/ and the instructions on how to
report
a bug at http://bugs.php.net/how-to-report.php
DateTime::ISO8601 is defined to "Y-m-d\TH:i:sO"[1], so obviously
it doesn't accept microsecond fractions. If you expect these to be
given, use another format specifier, see <https://3v4l.org/ADn0l>.
If you want to accept different ISO-8601 date/time formats,
don't use date_create_from_format(), but rather date_create(),
see <https://3v4l.org/c879B>.
[1] <http://php.net/manual/en/class.datetime.php>
------------------------------------------------------------------------
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