[php-src] Issue #13341: Wrong result from DateTimeImmutable::diff
| From: | ryan-hoppe | Date: | Tue, 06 Feb 2024 19:45:05 +0000 |
| Subject: | [php-src] Issue #13341: Wrong result from DateTimeImmutable::diff | ||
| Groups: | php.bugs | ||
| Request: | Send a blank email to php-bugs+get-246421@lists.php.net to get a copy of this message | ||
Issue: https://github.com/php/php-src/issues/13341
Author: ryan-hoppe
### Description
If you run execute this code, it produces an extremely weird result. The first DTI is 11 minutes
after what we’re
->diff() ’ing against, but when in the local
America/Los_Angeles TZ, it produces a very strange result. Converting the first DTI to UTC then
produces the expected difference of 11 minutes.
```php
//Difference of -1 year, 11 months, 31 days, etc.
<?php
$invalid_result = (new \DateTimeImmutable('2024-01-31 17:00:00', new
\DateTimeZone('America/Los_Angeles')))
->diff(new \DateTimeImmutable('2024-02-01 00:49:00'));
//Difference of 11 minutes
$correct_result = (new \DateTimeImmutable('2024-01-31 17:00:00', new
\DateTimeZone('America/Los_Angeles')))
->setTimezone(new \DateTimeZone('UTC'))
->diff(new \DateTimeImmutable('2024-02-01 00:49:00'));
var_dump($invalid_result);
var_dump($correct_result);
```
$invalid_result Resulted in this output:
```
object(DateInterval)#3 (10) {
["y"]=>
int(-1)
["m"]=>
int(11)
["d"]=>
int(31)
["h"]=>
int(0)
["i"]=>
int(11)
["s"]=>
int(0)
["f"]=>
float(0)
["invert"]=>
int(1)
["days"]=>
int(0)
["from_string"]=>
bool(false)
}
```
But I expected this output instead:
```
object(DateInterval)#2 (10) {
["y"]=>
int(0)
["m"]=>
int(0)
["d"]=>
int(0)
["h"]=>
int(0)
["i"]=>
int(11)
["s"]=>
int(0)
["f"]=>
float(0)
["invert"]=>
int(1)
["days"]=>
int(0)
["from_string"]=>
bool(false)
}
```
### PHP Version
PHP 8.1
### Operating System
_No response_