Edit report at http://bugs.php.net/bug.php?id=52454&edit=1

 ID:                 52454
 Comment by:         mike at iammike dot co dot uk
 Reported by:        ben dot davies at stickyeyes dot com
 Summary:            Relative dates and getTimestamp increments by one
                     day
 Status:             Assigned
 Type:               Bug
 Package:            Date/time related
 Operating System:   Windows 7 Professional
 PHP Version:        5.3.3
 Assigned To:        derick
 Block user comment: N

 New Comment:

I believe I've encountered the same bug although with slightly different


effects.



Code to reproduce

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

date_default_timezone_set("Europe/London");



$s = new DateTime;

$e = new DateTime("+3 months");

$i = new DateInterval("P1M");

$p = new DatePeriod($s, $i, $e);



foreach($p as $m) {

        $m->getTimestamp();

        $m->getTimestamp();

        echo $m->format("Y-m-d") . "\n";

}





Expected results

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

2010-08-20

2010-09-20

2010-10-20



Actual results

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

2010-08-20

2010-11-20

2010-12-20



I first encountered this in PHP 5.3.2-1ubuntu4.2 but I've verified it's
still 

there in PHP 5.3.99-dev (trunk snapshot 201008200830).



Additional calls to getTimestamp cause the month to be incremented
further.



Interestingly, if you swap "+3 months" for "+3 years" and "P1M" for
"P1Y" the 

year is affected instead of the month.


Previous Comments:
------------------------------------------------------------------------
[2010-07-27 11:46:01] ben dot davies at stickyeyes dot com

Description:
------------
If you create a DateTime object using a relative date string of "this
week +6 days", when calling getTimestamp on the datetime object, the
date is mysteriously increments by one day. However, if you seperately
modify the datetime using 'this week', then '+6 days', it works
correctly.



Where is the additional day comeing from, and why is it only applied
when calling format('U') DOESNT increment the datetime by 1 day. Wierd!



Here is a work around:



$endOfWeek = new DateTime();

$endOfWeek->modify('this week');

$endOfWeek->modify('+6 days');



echo $endOfWeek->format('Y-m-d H:m:s')."\n";

echo $endOfWeek->format('U')."\n";



/* Thar she blows! */

echo $endOfWeek->getTimestamp()."\n";



echo $endOfWeek->format('Y-m-d H:m:s')."\n";

Test script:
---------------
$endOfWeek = new DateTime();

$endOfWeek->modify('this week +6 days');



echo $endOfWeek->format('Y-m-d H:m:s')."\n";

echo $endOfWeek->format('U')."\n";



/* Thar she blows! */

echo $endOfWeek->getTimestamp()."\n";



echo $endOfWeek->format('Y-m-d H:m:s')."\n";



Expected result:
----------------
DateTime should stay the same after a call to getTimestamp (surely
getTimestamp should be safe from side effects)



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



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

Reply via email to