Bug #51051 [Com]: DateTime modify wrong result with DST change

From: Date: Tue, 19 Jul 2016 09:26:50 +0000
Subject: Bug #51051 [Com]: DateTime modify wrong result with DST change
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-202415@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=51051&edit=1 ID: 51051 Comment by: dasistmeine-mail at gmx dot de Reported by: mehdi dot rande at aliasource dot fr Summary: DateTime modify wrong result with DST change Status: Assigned Type: Bug Package: Date/time related Operating System: Linux PHP Version: 5.3.1 Assigned To: derick Block user comment: N Private report: N New Comment: This bug is still present as of PHP 7.0.5! $date = new DateTime('2017-03-26 1:59:59', new DateTimeZone('Europe/Berlin')); echo $date->format('Y-m-d H:i:s') . PHP_EOL; $date->modify('+ 1 second')->modify('- 1 second'); echo $date->format('Y-m-d H:i:s') . PHP_EOL; expected: 2017-03-26 1:59:59 2017-03-26 1:59:59 actualy got: 2017-03-26 01:59:59 2017-03-26 03:59:59 Previous Comments: ------------------------------------------------------------------------ [2016-03-13 23:52:53] cvkline at gmail dot com This bug is still present as of PHP 5.5.25! $gd = new DateTime('2016-03-13 03:30:00'); echo $gd->format('Y-m-d H:i:s T') . "\n"; $gd->modify('-45 minutes'); echo $gd->format('Y-m-d H:i:s T') . "\n"; produces: 2016-03-13 03:30:00 CDT 2016-03-13 03:45:00 CDT ------------------------------------------------------------------------ [2013-05-30 14:56:05] joerg dot eichhorn at kiwigrid dot com Still present with: PHP 5.4.7 (cli) (built: Sep 12 2012 23:48:31) Copyright (c) 1997-2012 The PHP Group My former test script still shows the error: <?php $dt = new DateTime('now', new DateTimeZone('Europe/Berlin')); // try to set timestamp of 2010-10-31T02:00:00+0200 $dt->setTimestamp(1288483200); echo "Expected: 1288483200\n"; // but returns timestamp of 2010-10-31T02:00:00+0100 echo "Actual : ".$dt->getTimestamp()."\n"; // outputs 1288486800 ?> Any Ideas when this issue is going to be fixed? It's a serious issue that it returns another timestamp than what was set! ------------------------------------------------------------------------ [2013-03-19 18:09:02] kavi at postpro dot net This is still broken in 5.3.21, according to danielc's test. $ php --version PHP 5.3.21 (cli) (built: Jan 17 2013 12:34:34) Copyright (c) 1997-2013 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2013 Zend Technologies $ php derp.php SPRING INTERVALS (add okay, sub does not change hour) 2010-03-14T01:59:59-05:00 America/New_York EST 0 1268549999 Adding interval: PT1S 2010-03-14T03:00:00-04:00 America/New_York EDT 1 1268550000 Subtracting interval: PT1S 2010-03-14T03:59:59-04:00 America/New_York EDT 1 1268553599 SPRING TIMESTAMPS (works as expected) 2010-03-14T01:59:59-05:00 America/New_York EST 0 1268549999 Adding seconds: 1 2010-03-14T03:00:00-04:00 America/New_York EDT 1 1268550000 Subtracting seconds: 1 2010-03-14T01:59:59-05:00 America/New_York EST 0 1268549999 FALL INTERVALS (add and sub skip the 1am - 2am redo) 2010-11-07T00:59:59-04:00 America/New_York EDT 1 1289105999 Adding interval: PT1H 2010-11-07T01:59:59-04:00 America/New_York EDT 1 1289109599 Adding interval: PT1S 2010-11-07T02:00:00-05:00 America/New_York EST 0 1289113200 Subtracting interval: PT1S 2010-11-07T01:59:59-04:00 America/New_York EDT 1 1289109599 FALL TIMESTAMPS (works as expected) 2010-11-07T00:59:59-04:00 America/New_York EDT 1 1289105999 Adding seconds: 3600 2010-11-07T01:59:59-04:00 America/New_York EDT 1 1289109599 Adding seconds: 1 2010-11-07T01:00:00-05:00 America/New_York EST 0 1289109600 Adding seconds: 3600 2010-11-07T02:00:00-05:00 America/New_York EST 0 1289113200 Subtracting seconds: 1 2010-11-07T01:59:59-05:00 America/New_York EST 0 1289113199 ------------------------------------------------------------------------ [2012-05-17 00:12:04] kavi at postpro dot net See also: https://bugs.php.net/bug.php?id=60960 https://bugs.php.net/bug.php?id=61530 https://bugs.php.net/bug.php?id=52480 Quoting https://wiki.php.net/rfc/datetime_and_daylight_saving_time -- "Getting these issues straightened out before 5.4 goes into Release Candidate status seems wise." ------------------------------------------------------------------------ [2012-03-14 14:36:41] webmaster at martinandersson dot com DateTime::diff get's it wrong in PHP 5.4. Tested on Apache (with PHP 5.4 VC9) / Windows 7 x64. Code of horror: $d1 = new DateTime("2011-10-30 01:05:00", new DateTimeZone("Europe/Stockholm")); $d2 = new DateTime("2011-10-30 03:05:00", new DateTimeZone("Europe/Stockholm")); $di = $d1->diff($d2); echo $di->h; This produces '2' whereas it should have said '3' because in this timezone and interval (more precisly 03:00:00), all Swedes turned their clock back 1 hour. Still, the internal logic of PHP 5.4 knows about the different offsets: echo $d1->getOffset() / (60 * 60); Prints '2'. echo $d2->getOffset() / (60 * 60); Prints '1'. A direct calculation with UNIX timestamps produces the correct result: $hoursofdiff = ($d2->getTimeStamp() - $d1->getTimeStamp()) / 60 / 60; echo "Calculated difference in hours: $hoursofdiff"; Prints '3'. This issue has been further elaborated here: http://stackoverflow.com/questions/9695870/phps-datetimediff-gets-it-wrong ------------------------------------------------------------------------ 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=51051 -- Edit this bug report at https://bugs.php.net/bug.php?id=51051&edit=1

« previous php.bugs (#202415) next »