Bug #61955 [Com]: Adding DateInterval to DateTime adds 1 additional hour

From: Date: Tue, 11 Sep 2012 19:13:10 +0000
Subject: Bug #61955 [Com]: Adding DateInterval to DateTime adds 1 additional hour
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-173341@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=61955&edit=1

 ID:                 61955
 Comment by:         chris dot baker dot gr at gmail dot com
 Reported by:        php at arjanonline dot net
 Summary:            Adding DateInterval to DateTime adds 1 additional
                     hour
 Status:             Assigned
 Type:               Bug
 Package:            Date/time related
 Operating System:   Linux / Mac
 PHP Version:        5.3.12
 Assigned To:        derick
 Block user comment: N
 Private report:     N

 New Comment:

To amend my earlier comment: my repro attempts show that if I create an instance of DateTime by
passing a string to the constructor, everything works fine. If I use a timestamp in combination with
DateTime::createFromFormat, I see the bug affect the results

Use of a string
-------------------------	
$start = new DateTime('09/13/2012 7:00pm');
$end = new DateTime('09/13/2012 8:00pm');
$interval = DateInterval::createFromDateString('30 minutes');

// expected, 1 hours, 0 minutes, get 1 hours, 0 minutes
$diff = $start->diff($end);
print 'Diff: '.$diff->h.' hours, '.$diff->i.'
minutes'."\n";

$end->add($interval);
$diff = $start->diff($end);
// ecpected: 1 hours, 30 minutes, get 1 hours, 30 minutes
print "\n".'Diff after interval: '.$diff->h.' hours,
'.$diff->i.' minutes';


Use of a timestamp
-------------------------

$start = DateTime::createFromFormat('U', 1347577200);
$end =  DateTime::createFromFormat('U', 1347580800);
$interval = DateInterval::createFromDateString('30 minutes');

// expected, 1 hours, 0 minutes, get 1 hours, 0 minutes
$diff = $start->diff($end);
print 'Diff: '.$diff->h.' hours, '.$diff->i.'
minutes'."\n";

$end->add($interval);
$diff = $start->diff($end);
// ecpected: 1 hours, 30 minutes, get 2 hours, 30 minutes
print "\n".'Diff after interval: '.$diff->h.' hours,
'.$diff->i.' minutes';

http://3v4l.org/fivbW

The extra one hour makes less sense considering that my server timezone is -5 UTC -- not that it
makes sense for DateInterval to be sensitive to timezone!


Previous Comments:
------------------------------------------------------------------------
[2012-09-11 14:58:51] chris dot baker dot gr at gmail dot com

Can reproduce this as well, just determined it to be the cause of new errors in a scheduling web app
after updating to 5.4.

------------------------------------------------------------------------
[2012-07-09 19:47:08] jgardynik at endlessrealities dot com

I'm getting the same thing. Any single date_modify() call is causing an extra hour to be added.
If I add 1 minute, it still adds an extra hour. The commit that was bisected is very clearly adding
an extra hour. If I use Pacific/Honolulu or UTC in date_default_timezone_set() it works fine.
Apparently the fix was not specific enough in its implementation and it's taking effect all the
time.

This is causing every single one of my monthly comparison reports to break in a rather large system
because the time is getting thrown off.

I'm using PHP 5.4.4 on linux.

------------------------------------------------------------------------
[2012-05-19 15:03:40] graham at grahamc dot com

One minor clarification - This is occurring in every version above 5.3.8.

After running git bisect, I've narrowed it down to this particular commit: 
https://github.com/php/php-src/commit/7411ae09f5565b3f0dfbbfeb71c8f848fd38d6ca

------------------------------------------------------------------------
[2012-05-11 15:51:21] zhanglijiu at gmail dot com

My result is object(DateTime)#2 (3) { ["date"]=> string(19) "1970-01-01
00:00:05" 
["timezone_type"]=> int(1) ["timezone"]=> string(6) "+00:00" }

My system is MAC 10.6.8 php 5.3.1

------------------------------------------------------------------------
[2012-05-05 20:45:27] php at arjanonline dot net

Description:
------------
When I create a DateTime object from a (any) timestamp and then add a DateInterval object to the
DateTime object, the time in the DateInterval object is added and one additional hour is also added.

I have not noticed this behavior in versions up to and including 5.3.8, only in newer 5.3 versions.
(I did not test in 5.4.)
Also the behavior is related to the default time zone, even though the created DateTime object is in
UTC. I have tested several timezones and it appears that all Europe/* and North American America/*
timezones are affected. The Australian timezones seem to be unaffected.

Information from phpinfo():
date
- date/time support => enabled
- "Olson" Timezone Database Version => 2012.3
- Timezone Database => internal


Test script:
---------------
date_default_timezone_set('Europe/Amsterdam');
$d1 = new DateTime('@0');
$d2 = clone($d1);
$d2->add(new DateInterval('PT5S'));
var_dump($d2);


Expected result:
----------------
object(DateTime)[2]
  public 'date' => string '1970-01-01 00:00:05' (length=19)
  public 'timezone_type' => int 1
  public 'timezone' => string '+00:00' (length=6)

Actual result:
--------------
object(DateTime)[2]
  public 'date' => string '1970-01-01 01:00:05' (length=19)
  public 'timezone_type' => int 1
  public 'timezone' => string '+00:00' (length=6)


------------------------------------------------------------------------



-- 
Edit this bug report at https://bugs.php.net/bug.php?id=61955&edit=1


Thread (14 messages)

« previous php.bugs (#173341) next »