Bug #51950 [Com]: DateTime does not handle decimal fractions of ISO 8601 format

From: Date: Tue, 13 Sep 2022 10:40:27 +0000
Subject: Bug #51950 [Com]: DateTime does not handle decimal fractions of ISO 8601 format
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-242410@lists.php.net to get a copy of this message
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


Thread (12 messages)

« previous php.bugs (#242410) next »