Edit report at http://bugs.php.net/bug.php?id=52454&edit=1
ID: 52454 Updated by: [email protected] Reported by: ben dot davies at stickyeyes dot com Summary: Relative dates and getTimestamp increments by one day -Status: Assigned +Status: Closed 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: This bug has been fixed in SVN. Snapshots of the sources are packaged every three hours; this change will be in the next snapshot. You can grab the snapshot at http://snaps.php.net/. Thank you for the report, and for helping us make PHP better. Previous Comments: ------------------------------------------------------------------------ [2010-08-30 18:25:54] [email protected] Automatic comment from SVN on behalf of derick Revision: http://svn.php.net/viewvc/?view=revision&revision=302890 Log: - Fixed bug #52454 (Relative dates and getTimestamp increments by one day) ------------------------------------------------------------------------ [2010-08-20 12:05:18] mike at iammike dot co dot uk Removing the call to timelib_ts_update in date_get_timestamp as per 52454_date_get_timestamp.patch fixes it. I'm not sure if it's the right thing to do but I can't think of a good reason you'd need to update anything when retrieving a timestamp. ------------------------------------------------------------------------ [2010-08-20 11:43:03] mike at iammike dot co dot uk 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. ------------------------------------------------------------------------ [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
