Bug #69943 [Com]: DateTime::add() and sub() doesn't account for TZ transitions

From: Date: Sat, 27 Jun 2015 08:56:32 +0000
Subject: Bug #69943 [Com]: DateTime::add() and sub() doesn't account for TZ transitions
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-193934@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=69943&edit=1 ID: 69943 Comment by: kernins at gmail dot com Reported by: kernins at gmail dot com Summary: DateTime::add() and sub() doesn't account for TZ transitions Status: Assigned Type: Bug Package: Date/time related Operating System: Linux PHP Version: 5.6.10 Assigned To: derick Block user comment: N Private report: N New Comment: >You can update it with the timezonedb PECL extension Thanks for the info Previous Comments: ------------------------------------------------------------------------ [2015-06-26 21:50:50] derick@php.net There are a few issues, but I would also like to point out that PHP does use its own bundled database. You can update it with the timezonedb PECL extension (except for the last two versions due to compatibility issues). ------------------------------------------------------------------------ [2015-06-26 16:58:21] kernins at gmail dot com Also 5.3.0 - 5.3.6 results looks interesting (note the diff() result and offsets) int(1) string(24) "2014-10-26T02:59:59+0300" string(24) "2014-10-25T23:59:59+0400" ------------------------------------------------------------------------ [2015-06-26 16:55:32] kernins at gmail dot com Description: ------------ See the snippet http://3v4l.org/YgUIV diff() behaves correctly, but add/sub - not. PHP 5.4.34-5.4.42 and 5.5.18-5.6.10 are affected As for older versions showing 1 hour difference - does php use its own bundled tzdata instead of system one? It may explain The dates in example are around latest Europe/Moscow transition from +04:00 to +03:00 happened at 2014-10-25T22:00:00 UTC (01:59:59+04:00 + 1sec -> 01:00:00+03:00) Test script: --------------- $tz=new DateTimeZone('Europe/Moscow'); $d1=new DateTime('2014-10-26T00:59:59', $tz); $d2=new DateTime('2014-10-26T01:59:59', $tz); var_dump($d2->diff($d1, true)->h); var_dump($d1->add($int=new DateInterval('PT2H'))->format(DateTime::ISO8601), $d2->sub($int)->format(DateTime::ISO8601)); Expected result: ---------------- Consistent add/sub results assuming 2hrs difference between test dates 2014-10-26T01:59:59+0300 for add() 2014-10-26T00:59:59+0400 for sub() Actual result: -------------- http://3v4l.org/YgUIV diff=2 2014-10-26T02:59:59+0300 2014-10-25T23:59:59+0400 ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=69943&edit=1

« previous php.bugs (#193934) next »