php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #79716 Invalid date time created (with day "00")
Submitted: 2020-06-19 13:07 UTC Modified: 2021-04-06 19:56 UTC
From: a dot schilder at gmx dot de Assigned: derick (profile)
Status: Closed Package: Date/time related
PHP Version: 7.4.7 OS: Windows, Linux
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 you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: a dot schilder at gmx dot de
New email:
PHP Version: OS:

 

 [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"
}

Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2020-06-19 14:14 UTC] cmb@php.net
-Status: Open +Status: Verified -Operating System: Windows 10 +Operating System: Windows, Linux
 [2020-06-19 14:14 UTC] cmb@php.net
Confirmed: <https://3v4l.org/nA0p0>.  Doesn't seem to be Windows specific.
 [2020-06-20 10:12 UTC] a dot schilder at gmx dot de
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"
}
 [2021-04-06 19:56 UTC] derick@php.net
-Status: Verified +Status: Closed -Assigned To: +Assigned To: derick
 [2021-04-06 19:56 UTC] derick@php.net
The fix for this bug has been committed.
If you are still experiencing this bug, try to check out latest source from https://github.com/php/php-src and re-test.
Thank you for the report, and for helping us make PHP better.

Fixed for PHP 8.1.
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Thu Nov 21 11:01:29 2024 UTC