|  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #51950 DateTime does not handle decimal fractions of ISO 8601 format
Submitted: 2010-05-30 19:56 UTC Modified: 2019-07-16 09:25 UTC
Avg. Score:4.3 ± 0.8
Reproduced:119 of 120 (99.2%)
Same Version:24 (20.2%)
Same OS:18 (15.1%)
From: jmf at durcommefaire dot net Assigned: cmb (profile)
Status: Not a bug Package: Date/time related
PHP Version: 5.3.2 OS: Ubuntu 10.04
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If this is not your bug, you can add a comment by following this link.
If this is your bug, but you forgot your password, you can retrieve your password here.
Bug Type:
From: jmf at durcommefaire dot net
New email:
PHP Version: OS:


 [2010-05-30 19:56 UTC] jmf at durcommefaire dot net
DateTime does not handle decimal fractions of ISO 8601 format (cf.

This value has decimal fraction and is not recognized by DateTime :

$dateTime = DateTime::createFromFormat(
// bool(false)

The same value without the decimal fraction is recognized :

$dateTime = DateTime::createFromFormat(
// object(DateTime)#2 (3) { ["date"]=>  string(19) "2009-04-16 12:07:23" ["timezone_type"]=>  int(2) ["timezone"]=>  string(1) "Z" }


Add a Patch

Pull Requests

Add a Pull Request


AllCommentsChangesGit/SVN commitsRelated reports
 [2010-06-06 22:25 UTC]
-Assigned To: +Assigned To: deric
 [2010-06-06 22:25 UTC]
-Assigned To: deric +Assigned To: derick
 [2014-10-15 14:25 UTC] h dot kraal at tiw dot nl
This 4+ years old bug is still present in todays systems:
Ubuntu 10.04 / PHP 5.3.2-1ubuntu4.27
Ubuntu 12.04 / PHP 5.3.10-1ubuntu3.14
Ubuntu 14.04 / PHP 5.5.9-1ubuntu4.4
 [2014-11-12 23:48 UTC] dev at jonathanlidbeck dot com
This bug is present in PHP 5.5 for Windows.
 [2015-06-25 05:05 UTC] broncha at rajesharma dot com
Confirmed on Mac. PHP version 5.5.26
 [2015-12-01 09:28 UTC] seb at rootsandrain dot com
Still broken in PHP7:
 [2016-08-07 14:51 UTC]
-Status: Assigned +Status: Not a bug -Assigned To: derick +Assigned To: cmb
 [2016-08-07 14:51 UTC]
Thank you for taking the time to write to us, but this is not
a bug. Please double-check the documentation available at and the instructions on how to report
a bug at

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 <>.

If you want to accept different ISO-8601 date/time formats,
don't use date_create_from_format(), but rather date_create(),
see <>.

[1] <>
 [2018-12-05 13:40 UTC] christophe at gosiau dot be
I would like to refer to this Wikipedia article:

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.
 [2019-07-16 08:59 UTC] 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?
 [2019-07-16 09:25 UTC]
> 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] <>
[2] <>
 [2021-03-16 07:19 UTC] 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:
 [2022-09-13 10:10 UTC] xrypak at gmail dot com
Here a value from [the documentation]( 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?
 [2022-09-13 10:40 UTC] xrypak at gmail dot com
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.
PHP Copyright © 2001-2023 The PHP Group
All rights reserved.
Last updated: Mon Oct 02 01:01:25 2023 UTC