|  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #80974 Wrong diff between 2 dates in different timezones
Submitted: 2021-04-21 22:00 UTC Modified: 2021-08-17 13:40 UTC
Avg. Score:3.5 ± 0.5
Reproduced:1 of 1 (100.0%)
Same Version:1 (100.0%)
Same OS:1 (100.0%)
From: kylekatarnls at gmail dot com Assigned: derick (profile)
Status: Closed Package: Date/time related
PHP Version: master-Git-2021-04-21 (Git) OS: Ubuntu
Private report: No CVE-ID: None
 [2021-04-21 22:00 UTC] kylekatarnls at gmail dot com
In PHP < 8.1, comparing 2 date-times from different timezones would consider the real moment they represent to return the diff, which is completly relevant. But it's no longer true (sounds like introduced by 091c0920b9db057a54dc43ece6e864bce6818d5e).

Test script:
$dtToronto = new DateTime('2012-01-01 00:00:00.000000 America/Toronto');
$dtVancouver = new DateTime('2012-01-01 00:00:00.000000 America/Vancouver');

echo $dtVancouver->diff($dtToronto)->format('%h');

Expected result:

Actual result:


Add a Patch

Pull Requests

Pull requests:

Add a Pull Request


AllCommentsChangesGit/SVN commitsRelated reports
 [2021-04-21 22:03 UTC]
-Assigned To: +Assigned To: derick
 [2021-04-22 09:50 UTC]
The following pull request has been associated:

Patch Name: Fix #80974: Wrong diff between 2 dates in different timezones
On GitHub:
 [2021-04-26 08:22 UTC] corey dot taylor dot fl at gmail dot com
I assume this is related since it was closed with the large patch from derick.
 [2021-08-08 12:42 UTC]
-Status: Assigned +Status: Closed
 [2021-08-08 12:42 UTC]
The fix for this bug has been committed.
If you are still experiencing this bug, try to check out latest source from and re-test.
Thank you for the report, and for helping us make PHP better.

For 8.1.0beta3
 [2021-08-16 19:37 UTC] kylekatarnls at gmail dot com
Hello, sorry derick but here the fix caused an other regression:

Try the following code:

$d1 = new DateTimeImmutable('2014-07-08 15:20', new DateTimeZone('America/Toronto'));
$d2 = $d1->modify('1 day');

var_dump($d1->setTimezone(new DateTimeZone('UTC'))->diff($d2)->days);

`days` is 1 for both in PHP < 8.1 => correct since $d2 is $d1 + 1 day and there is no DST there, so I expect to always get 1 with any timezone.

`days` is 0 since 8.1.0beta3 => very likely a bug.

Did you check my PR?
 [2021-08-17 13:14 UTC]
Kyle, your new "bug" is unrelated to the one that was reported here. The "days" property is not the same as formatting the "d" (representing days in a year/month/days kind of way), which with your test case are correct:
 [2021-08-17 13:40 UTC] kylekatarnls at gmail dot com
Is this bug tracked somewhere and planned to be fixed before stable release? It's not there in PHP <= 8.0 and I didn't noticed it neither before 8.1.0beta3.
 [2021-09-18 19:56 UTC] kylekatarnls at gmail dot com
I think the fix for this bug caused the following regression:
PHP Copyright © 2001-2021 The PHP Group
All rights reserved.
Last updated: Sun Sep 19 12:03:36 2021 UTC