Re: DateInterval bug
| From: | Derick Rethans | Date: | Mon, 13 Apr 2015 20:20:27 +0000 |
| Subject: | Re: DateInterval bug | ||
| References: | 1 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-85791@lists.php.net to get a copy of this message | ||
On Sun, 12 Apr 2015, Peter Lind wrote:
> Hi,
>
> I wanted to get into PHP code development so I grabbed a random bug from
> bugs.php.net. Which turned out to be
> https://bugs.php.net/bug.php?id=69378
>
> The problem the bug report describes is that creating a diff between two
> dates and then subtracting the diff from the later date does not give you
> the former date. Or, as the bug report state, this should hold:
>
> B - (B - A) == A
>
> But it doesn't, because of the way DateInterval and DateTime interact. A
> DateInterval is broken up into years, months, days, hours, minutes and
> seconds - which can be added or subtracted from a date. However, months are
> not fit size, so the order in which things are added or subtracted matters.
> In the bug report, the problem arises because months are subtracted before
> days - and there's a huge difference between subtracting 17 days from 2.
> April and from 2. March.
>
> In itself, this isn't a big problem - but apparently this behaviour is how
> the system is supposed to work. In the tests for the date extension, I
> found this test for DateTime::add
>
> echo "test_years_positive__6_shy_1_day: ";
> examine_diff('2007-02-06', '2000-02-07', 'P+6Y11M30DT0H0M0S',
> 2556);
>
> echo "test_years_negative__6_shy_1_day: ";
> examine_diff('2000-02-07', '2007-02-06', 'P-6Y11M28DT0H0M0S',
> 2556);
>
> The third argument in the examine_diff calls is used in the constructor
> call to DateInterval. The difference is whether the interval will be
> positive or negative. Note the difference of two days - if you add a
> positive interval, then 7 years minus 1 day is 6 years, 11 months and 30
> days. If you add a negative interval, then 7 years minus 1 day is 6 years,
> 11 months and 28 days.
>
> Is there a good explanation for this behaviour (which applies both to
> DateTime::add and DateTime::sub)? I've tried searching the internals list
> but couldn't see any discussion of it. It seems like a bug that never got
> fixed to the point where there are tests to make sure things are still
> calculated wrong.
Why is it a bug? With DateTime math, reversing an operation isn't
necessarily going to work...
cheers,
Derick
--
http://derickrethans.nl | http://xdebug.org
Like Xdebug? Consider a donation: http://xdebug.org/donate.php
twitter: @derickr and @xdebug
Posted with an email client that doesn't mangle email: alpine