Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:85774 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 69506 invoked from network); 12 Apr 2015 18:58:21 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 12 Apr 2015 18:58:21 -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.176 as permitted sender) X-PHP-List-Original-Sender: peter.e.lind@gmail.com X-Host-Fingerprint: 209.85.217.176 mail-lb0-f176.google.com Received: from [209.85.217.176] ([209.85.217.176:35914] helo=mail-lb0-f176.google.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id A5/40-62743-A40CA255 for ; Sun, 12 Apr 2015 14:58:18 -0400 Received: by lbbqq2 with SMTP id qq2so44491199lbb.3 for ; Sun, 12 Apr 2015 11:58:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:from:date:message-id:subject:to:content-type; bh=5SmQPqRc7Fn2yLEI1+VGjzYjG9/auqm+P4gqsfn/T3Q=; b=naheY3PNEODSUJPCYnkmY4Bw3p2SOvL8iF6qeeXUYNIN985tK4gYsCExQYtRmB95fl bXOS8flT3dFg7nkcXVnvn5YZ1u6Cg542MFab/fcp/BDDObqRpAmtV2ldAC4sBJD/4Jcp 83jSaFaWXZoWoxKMjbgM0NwV1myyd3PvG3ICFg/1jTfxen5C0EIPZK1ZRd0naARAsL+E ouuPo0YEzoZE6McLHEfscVHn5JxsRfKno6aemOebnNeqNtUmrN7GJ59EpoYjy8baShha wPmoPAuT4gkggpq1R5XcwhqxEXeVhVrpv/xlq7rnXrOgO4ZNnGOHWv7KFu22EkPDG4rC 4vOg== X-Received: by 10.112.150.130 with SMTP id ui2mr10011762lbb.116.1428865095336; Sun, 12 Apr 2015 11:58:15 -0700 (PDT) MIME-Version: 1.0 Received: by 10.112.104.35 with HTTP; Sun, 12 Apr 2015 11:57:55 -0700 (PDT) Date: Sun, 12 Apr 2015 20:57:55 +0200 Message-ID: To: PHP internals Content-Type: multipart/alternative; boundary=047d7b3a821a708a4a05138b943c Subject: DateInterval bug From: peter.e.lind@gmail.com (Peter Lind) --047d7b3a821a708a4a05138b943c Content-Type: text/plain; charset=UTF-8 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. Regards Peter -- WWW: plphp.dk / plind.dk CV: careers.stackoverflow.com/peterlind LinkedIn: plind Twitter: kafe15 --047d7b3a821a708a4a05138b943c--