]> source.dussan.org Git - nextcloud-server.git/commitdiff
fix(dav): Avoid date diffing if PHP is buggy 41722/head
authorChristoph Wurst <christoph@winzerhof-wurst.at>
Fri, 24 Nov 2023 08:45:56 +0000 (09:45 +0100)
committerChristoph Wurst <christoph@winzerhof-wurst.at>
Fri, 24 Nov 2023 08:45:56 +0000 (09:45 +0100)
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
apps/dav/lib/CalDAV/Reminder/Notifier.php

index 271d8e88fa77caa1bdf16a2aecf1b3b5661de031..657714d0247a1ff3de23224746438fb0fd7d610d 100644 (file)
@@ -170,20 +170,34 @@ class Notifier implements INotifier {
                        $components[] = $this->l10n->n('%n minute', '%n minutes', $diff->i);
                }
 
-               // Limiting to the first three components to prevent
-               // the string from getting too long
-               $firstThreeComponents = array_slice($components, 0, 2);
-               $diffLabel = implode(', ', $firstThreeComponents);
-
-               if ($diff->invert) {
-                       $title = $this->l10n->t('%s (in %s)', [$title, $diffLabel]);
-               } else {
-                       $title = $this->l10n->t('%s (%s ago)', [$title, $diffLabel]);
+               if (!$this->hasPhpDatetimeDiffBug()) {
+                       // Limiting to the first three components to prevent
+                       // the string from getting too long
+                       $firstThreeComponents = array_slice($components, 0, 2);
+                       $diffLabel = implode(', ', $firstThreeComponents);
+
+                       if ($diff->invert) {
+                               $title = $this->l10n->t('%s (in %s)', [$title, $diffLabel]);
+                       } else {
+                               $title = $this->l10n->t('%s (%s ago)', [$title, $diffLabel]);
+                       }
                }
 
                $notification->setParsedSubject($title);
        }
 
+       /**
+        * @see https://github.com/nextcloud/server/issues/41615
+        * @see https://github.com/php/php-src/issues/9699
+        */
+       private function hasPhpDatetimeDiffBug(): bool {
+               $d1 = DateTime::createFromFormat(\DateTimeInterface::ATOM, '2023-11-22T11:52:00+01:00');
+               $d2 = new DateTime('2023-11-22T10:52:03', new \DateTimeZone('UTC'));
+
+               // The difference is 3 seconds, not -1year+11months+…
+               return $d1->diff($d2)->y < 0;
+       }
+
        /**
         * Sets the notification message based on the parameters set in PushProvider
         *