Edit report at https://bugs.php.net/bug.php?id=51051&edit=1
ID: 51051 Comment by: webmaster at martinandersson dot com 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: 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 Previous Comments: ------------------------------------------------------------------------ [2011-11-21 02:43:15] dani...@php.net This will be addressed by https://wiki.php.net/rfc/datetime_and_daylight_saving_time ------------------------------------------------------------------------ [2011-04-18 17:30:09] halde at freenet dot de reproduced issue of previous poster on a linux machine (timestamps are not equal): $ php -a Interactive shell php > $dt = new DateTime('now', new DateTimeZone('Europe/Berlin')); php > $dt->setTimestamp(1288483200); php > echo $dt->getTimestamp(); 1288486800 php > echo phpversion(); 5.3.3-1ubuntu9.3 php > exit $ uname -a Linux wum128229 2.6.35-28-generic #49-Ubuntu SMP Tue Mar 1 14:39:03 UTC 2011 x86_64 GNU/Linux ------------------------------------------------------------------------ [2011-02-24 17:07:56] j dot ek at gmx dot net Think I found a related issue, reproduce it with: <?php $dt = new DateTime('now', new DateTimeZone('Europe/Berlin')); // try to set timestamp of 2010-10-31T02:00:00+0200 $dt->setTimestamp(1288483200); // but returns timestamp of 2010-10-31T02:00:00+0100 echo $dt->getTimestamp(); // outputs 1288486800 ?> WinXP 32, PHP 5.3.2 (cli) (built: Mar 3 2010 20:36:54) ------------------------------------------------------------------------ [2010-12-25 02:46:45] danielc at analysisandsolutions dot com DateTime::diff() is similarly afflicted with daylight/standard change over issues. Naturally, diff/add/sub all need to be in sync so intervals returned by diff can be passed to add/sub and produce the original datetime. ------------------------------------------------------------------------ [2010-12-25 02:27:22] dani...@php.net I just attached a test script that covers issues in the spring and fall. ------------------------------------------------------------------------ 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