Doc #78603 [Com]: DateTime::createFromFormat() missing component behaviour change

From: Date: Mon, 30 Sep 2019 11:02:56 +0000
Subject: Doc #78603 [Com]: DateTime::createFromFormat() missing component behaviour change
References: 1  Groups: php.doc.bugs 
Request: Send a blank email to doc-bugs+get-16976@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=78603&edit=1

 ID:                 78603
 Comment by:         chris dot smith at widerplan dot com
 Reported by:        chris dot smith at widerplan dot com
 Summary:            DateTime::createFromFormat() missing component
                     behaviour change
 Status:             Open
 Type:               Documentation Problem
 Package:            Date/time related
 Operating System:   Linux
 PHP Version:        7.3.10
 Block user comment: N
 Private report:     N

 New Comment:

> Testing it against anything pre 7.3 and it works as the documentation shows.

If you do DateTime::createFromFormat('s', '12'); then the other parts of the
time component are set to zero, i.e. the epoch this has been the same since 5.3 which does not
follow the documentation. As of 7.3 u now works the same as seconds/minutes/hours,
question is which behaviour is correct.

My thinking is that it should do what the documentation says but it's been broken so long and
nobody has noticed it, that it makes more sense to change the documentation to match reality.


Previous Comments:
------------------------------------------------------------------------
[2019-09-30 08:48:20] insidion at gmail dot com

This is absolutely a bug.

Testing it against anything pre 7.3 and it works as the documentation shows.

------------------------------------------------------------------------
[2019-09-27 14:11:52] chris dot smith at widerplan dot com

You are probably correct about it being documentation but there could also be some tests added to
ensure the behaviour does not change in future.

------------------------------------------------------------------------
[2019-09-27 14:05:37] requinix@php.net

If it's been this way since PHP 5.3 then the problem is the documentation.

------------------------------------------------------------------------
[2019-09-27 14:04:04] chris dot smith at widerplan dot com

Description:
------------
I'm not sure if this is a problem with the documentation or code.

The documentation states:

> If format does not contain the character ! then portions of the generated time which are not
> specified in format will be set to the current system time.

When executing the following based on the documentation I'd expect the hour, minute and seconds
to be set to the current time however they are set to the epoch.

DateTime::createFromFormat('u', '123456');
// PHP < 7.3: 2019-09-27 14:50:40.123456
// PHP >= 7.3: 2019-09-27 00:00:00.123456

Further investigation led me to discover that the following example also contradicts the
documentation and has been the case since the days of PHP 5.3.

DateTimeImmutable::createFromFormat('s', '12');
// 2019-09-27 00:00:12.000000
// Expected (per docs): 2019-09-27 14:50:12.000000

https://3v4l.org/v2bib

I ran a git bisect to identify when the microsecond handling changed which found:
09340ea9b9b2a06c6f1369502806640779073885

Test script:
---------------
<?php

$dt1 = DateTime::createFromFormat('u', '123456');
$dt2 = DateTime::createFromFormat('s', '25');

var_dump($dt1->format('H:i'));
var_dump($dt2->format('H:i:s'));

Expected result:
----------------
string(5) "14:29"
string(8) "14:29:25"

Actual result:
--------------
string(5) "00:00"
string(8) "00:00:25"


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



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


Thread (11 messages)

« previous php.doc.bugs (#16976) next »