Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:85799 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 21292 invoked from network); 14 Apr 2015 06:45:46 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 14 Apr 2015 06:45:46 -0000 Authentication-Results: pb1.pair.com smtp.mail=peter.e.lind@gmail.com; spf=pass; sender-id=pass Authentication-Results: pb1.pair.com header.from=peter.e.lind@gmail.com; sender-id=pass Received-SPF: pass (pb1.pair.com: domain gmail.com designates 209.85.217.174 as permitted sender) X-PHP-List-Original-Sender: peter.e.lind@gmail.com X-Host-Fingerprint: 209.85.217.174 mail-lb0-f174.google.com Received: from [209.85.217.174] ([209.85.217.174:35834] helo=mail-lb0-f174.google.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id C9/02-08334-997BC255 for ; Tue, 14 Apr 2015 02:45:46 -0400 Received: by lbbuc2 with SMTP id uc2so469087lbb.2 for ; Mon, 13 Apr 2015 23:45:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc:content-type; bh=GwvUilp5Yge1Rb7IbMWSsSeHxLVy/sAyTX6KTuWxwuo=; b=A04v+WvG5z676bNdltC3RYQnW17kDUel/zSvlfz32I7NRfyl3ttgLqNnQR6suHjjtY +l2vshAiWxCD9KQHJ7FE+fGwpkHtmpbVqOX/wqO185SGCKdvy6WsEExqbYvO9HF7K8lV hqnz0byDDENmoSrZPX3YWpAExeNmIU0/kODdVUJ8ttYXriPYsdPUIJJuvA1KXH8LmIGF +6LmHCVBXJkCtf86+Pub+5bYmHEF+ltsOIEM4wEJT2kynoiUwyvMi2+VoVMVGaX3DQ01 IuTDJPymptjmQDKxvmT/3+MO0vsl/RRqwmo41FCvTBnc/yVV6oBHTVzsuB9fUK8E4070 zC5w== X-Received: by 10.152.207.105 with SMTP id lv9mr16787577lac.10.1428993942514; Mon, 13 Apr 2015 23:45:42 -0700 (PDT) MIME-Version: 1.0 Received: by 10.112.104.35 with HTTP; Mon, 13 Apr 2015 23:45:21 -0700 (PDT) In-Reply-To: References: Date: Tue, 14 Apr 2015 08:45:21 +0200 Message-ID: To: Derick Rethans Cc: PHP internals Content-Type: multipart/alternative; boundary=001a113479205474790513a9942f Subject: Re: [PHP-DEV] DateInterval bug From: peter.e.lind@gmail.com (Peter Lind) --001a113479205474790513a9942f Content-Type: text/plain; charset=UTF-8 On 13 April 2015 at 22:20, Derick Rethans wrote: > 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... > > Forgot to mention - this has nothing to do with reversing operations. As you can see from the unit tests for the Date extension, figuring out what the interval is between two dates depends on knowing which dates you're dealing with and if your interval is positive or negative. The fact that the bug shows up for the example in the bug report is just a symptom of the underlying problem. Regards Peter -- WWW: plphp.dk / plind.dk CV: careers.stackoverflow.com/peterlind LinkedIn: plind Twitter: kafe15 --001a113479205474790513a9942f--