|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2020-06-19 13:07 UTC] a dot schilder at gmx dot de
Description:
------------
Situation:
I'm doing some datetiem calculations. I have a start date time and calculate following dates based on recurrence rules. This means I add date intervals to the start date time value until a specific date time or number of results. Depending on the rule the date can be hundreds oy years in the future.
Error:
From time to time I got an error when trying to get the number of days in month of the resulting date time. The value I got was "0" (which isn't documented, because it shouldn't be possible). When I dum the object, the internal date time value is set to the invalid date "2770-01-00 15:00:00.000000".
I can't say how it came to the result, because there were too many date intervals added to the start date time, but it's easy to reproduced by creating a date time instance directly with this wrong time value.
Reproduced in the following PHP Versions:
7.2.2, 7.4.2, 7.4.7, 8.0.0-dev
Test script:
---------------
<?php
$datetime = new \DateTimeImmutable(
'2770-01-00 15:00:00.000000',
new \DateTimeZone('UTC')
);
\var_dump($datetime->format('j') === '0');
\var_dump($datetime);
Expected result:
----------------
bool(false)
object(DateTimeImmutable)#3 (3) {
["date"]=>
string(26) "2769-12-31 15:00:00.000000"
["timezone_type"]=>
int(3)
["timezone"]=>
string(3) "UTC"
}
Actual result:
--------------
bool(true)
object(DateTimeImmutable)#3 (3) {
["date"]=>
string(26) "2770-01-00 15:00:00.000000"
["timezone_type"]=>
int(3)
["timezone"]=>
string(3) "UTC"
}
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Sun Nov 02 07:00:01 2025 UTC |
In the meantime I could reproduce it using a date interval. Script: <?php $datetime = new DateTimeImmutable('2768-12-31 15:00:00.000000', new \DateTimeZone('UTC')); $datetime = $datetime->add(new \DateInterval('P1Y')); var_dump($datetime); Result: object(DateTimeImmutable)#4 (3) { ["date"]=> string(26) "2770-01-00 15:00:00.000000" ["timezone_type"]=> int(3) ["timezone"]=> string(3) "UTC" }