Bug #81263 [Asn]: Wrong result from DateTimeImmutable::diff

From: Date: Sat, 18 Jun 2022 11:22:18 +0000
Subject: Bug #81263 [Asn]: Wrong result from DateTimeImmutable::diff
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-241760@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=81263&edit=1 ID: 81263 Updated by: derick@php.net Reported by: mail at gh01 dot de Summary: Wrong result from DateTimeImmutable::diff Status: Assigned Type: Bug Package: Date/time related PHP Version: master-Git-2021-07-15 (Git) Assigned To: derick Block user comment: N Private report: N New Comment: Fixed in third party library: https://github.com/derickr/timelib/compare/php-81263?expand=1 — which means it will make it into PHP once this library gets merged again. Previous Comments: ------------------------------------------------------------------------ [2022-03-22 21:52:48] matthew at komputerwiz dot net I pulled the latest source, compiled it, and ran the following example while in GDB: <?php $dFmt = \DateTimeInterface::ISO8601; $iFmt = '%R[%yy %mM %dd %hh %im %ss]'; // creates new DateTime for the current timezone (UTC-5 in my case) $exp = new \DateTime('+3600 seconds', new \DateTimeZone('-5')); echo 'expires: '.$exp->format($dFmt)."\n"; $gen = $exp->getTimestamp() - 3600; // creates new DateTime in UTC $genTime = \DateTime::createFromFormat('U', (string) $gen); echo 'created: '.$genTime->format($dFmt)."\n"; $ival = $exp->diff($genTime); echo 'interval: '.$ival->format($iFmt)."\n"; The expected interval output should be '-[0y 0M 0d 1h 0m 0s]', but is instead '-[-1y 11M 31d 1h 0m 0s]'. The problem seems to start around timelib.c:90, during the early relative normalization step. Just prior to this point, the rt struct contains: {y:0, m:0, d:0, h:-4, i:0, s:0, ...} The normalization step eliminates out-of-range negative values by "borrowing" from larger date units. After this point, rt contains: {y:-1, m:11, d:30, h:20, i:0, s:0, ...} When this is corrected for timezone offset (h += 5) and normalized again, it leads to the unexpected output above. Perhaps the issue stems from normalizing prior to correcting for time zone offset. If the timezone offset had been added prior to normalization, the "hours" field would have been in range. ------------------------------------------------------------------------ [2021-10-21 13:23:19] cmb@php.net This appears to be related to bug #81458. ------------------------------------------------------------------------ [2021-10-21 13:16:03] sjon@php.net while the related https://3v4l.org/8g4NB seems fixed, this issue remains ------------------------------------------------------------------------ [2021-10-07 22:36:34] mail at gh01 dot de This issue still exists in current master: https://3v4l.org/f1fai/rfc#vgitmaster ------------------------------------------------------------------------ [2021-08-08 11:18:24] derick@php.net Duplicate of #81273 ------------------------------------------------------------------------ The remainder of the comments for this report are too long. To view the rest of the comments, please view the bug report online at https://bugs.php.net/bug.php?id=81263 -- Edit this bug report at https://bugs.php.net/bug.php?id=81263&edit=1

« previous php.bugs (#241760) next »