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] [email protected]
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] [email protected]
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