Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:85791 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 83892 invoked from network); 13 Apr 2015 20:20:37 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 13 Apr 2015 20:20:37 -0000 Authentication-Results: pb1.pair.com smtp.mail=derick@php.net; spf=unknown; sender-id=unknown Authentication-Results: pb1.pair.com header.from=derick@php.net; sender-id=unknown Received-SPF: unknown (pb1.pair.com: domain php.net does not designate 82.113.146.227 as permitted sender) X-PHP-List-Original-Sender: derick@php.net X-Host-Fingerprint: 82.113.146.227 xdebug.org Linux 2.6 Received: from [82.113.146.227] ([82.113.146.227:45398] helo=xdebug.org) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id E1/26-41712-2152C255 for ; Mon, 13 Apr 2015 16:20:35 -0400 Received: from localhost (localhost [IPv6:::1]) by xdebug.org (Postfix) with ESMTPS id E31ABE202F; Mon, 13 Apr 2015 21:20:27 +0100 (BST) Date: Mon, 13 Apr 2015 21:20:27 +0100 (BST) X-X-Sender: derick@whisky.home.derickrethans.nl To: Peter Lind cc: PHP internals In-Reply-To: Message-ID: References: User-Agent: Alpine 2.11 (DEB 23 2013-08-11) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Subject: Re: [PHP-DEV] DateInterval bug From: derick@php.net (Derick Rethans) 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