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

 ID:               49081
 Updated by:       der...@php.net
 Reported by:      nate at frickenate dot com
 Summary:          [PATCH] DateTime::diff() mistake if start in January
                   and interval > 28 days
-Status:           Assigned
+Status:           Closed
 Type:             Bug
 Package:          Date/time related
 Operating System: *
 PHP Version:      5.3.0
 Assigned To:      derick

 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-05-04 17:11:44] der...@php.net

Automatic comment from SVN on behalf of derick
Revision: http://svn.php.net/viewvc/?view=revision&revision=298973
Log: - Fixed bug #49081 (DateTime::diff() mistake if start in January
and interval >
  28 days). (Derick)

------------------------------------------------------------------------
[2010-01-23 00:10:21] dani...@php.net

Here is an updated patch against PHP_5_3.  It removes all of the
"next_month" code in 



do_range_limit_days_relative().

http://www.analysisandsolutions.com/php/bug49081v2.53.diff



As with the earlier patch, PHP built fine with it and all of the
ext/date tests that passed under 



the unpached PHP_5_3 build continued to pass under the patched version.



Grepping the entire PHP_5_3 code base indicates the only place
do_range_limit_days_relative() gets 



called is in timelib_do_rel_normalize(), and the only place that gets
called is timelib_diff().



It is unclear what purpose the "next_month" functionality served. 
Perhaps it was there in case the 



"base_y" and "base_m" parameters were later than the "y"/"m"/"d"
parameters?  But that doesn't apply 



becausetimelib_diff() always passes the earlier date to
timelib_do_rel_normalize() as "one" and on to 



do_range_limit_days_relative() as "base_*".

------------------------------------------------------------------------
[2010-01-06 16:19:14] dani...@php.net

Hmm... Isn't the whole days_next_month functionality in
do_range_limit_days_relative() unnecessary?

------------------------------------------------------------------------
[2010-01-06 01:04:18] dani...@php.net

A better test file:

http://www.analysisandsolutions.com/php/bug49081v2.phpt



The scenarios it covers are more relevant and thorough, plus it improves
the context, making it easier see what the test is doing.

------------------------------------------------------------------------
[2010-01-05 22:11:57] dani...@php.net

This bug continues to exist in 5.3.2RC2.



DateTime::diff() / date_diff() chokes on dates starting in January if
the interval is greater than 28 days (during non-leap years).



It is happening because of a bug in do_range_limit_days_relative() in
ext/date/lib/tm2unixtime.c.  At the end of the function if *d >
days_next_month, the code subtracts the days and adds a month.  So when
the starting month is January, the days_next_month is 28 or 29,
mistakenly triggering the month/day swapping behavior.



Patch:

http://www.analysisandsolutions.com/php/bug49081.diff



Test:

http://www.analysisandsolutions.com/php/bug49081.phpt

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


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

    http://bugs.php.net/bug.php?id=49081


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

Reply via email to