Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:68306 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 52942 invoked from network); 25 Jul 2013 17:28:32 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 25 Jul 2013 17:28:32 -0000 Authentication-Results: pb1.pair.com smtp.mail=jakub.php@gmail.com; spf=pass; sender-id=pass Authentication-Results: pb1.pair.com header.from=jakub.php@gmail.com; sender-id=pass Received-SPF: pass (pb1.pair.com: domain gmail.com designates 209.85.216.42 as permitted sender) X-PHP-List-Original-Sender: jakub.php@gmail.com X-Host-Fingerprint: 209.85.216.42 mail-qa0-f42.google.com Received: from [209.85.216.42] ([209.85.216.42:57306] helo=mail-qa0-f42.google.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id 88/C5-05798-E3061F15 for ; Thu, 25 Jul 2013 13:28:31 -0400 Received: by mail-qa0-f42.google.com with SMTP id bv4so2650929qab.15 for ; Thu, 25 Jul 2013 10:28:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:date :x-google-sender-auth:message-id:subject:from:to:cc:content-type; bh=3+7OeEpwC39ZgaPVulEishfo8OBYhnt2IOD/KZ3l050=; b=0byd0KV497CS9pVMq2eI+0sNF3eI9I34tYO4z5GayRq7sJih0kUiC9OAyYGVhy6v9W feqZxvxHeh9VeLSs1OcJiHwfVoDZuvGOp9kNdTgdi+Dt8s+/mFqrvFbrz8WFVKzM7sdn U/pD31KO+qmJ8IxTHpvvvGkuG1mwZVsP38WlXnsS0CyVftNOK7sObjLCJ+jPny2yYiEF sGiNb/+/OhePxpIBjmEqgDhsCqKp5J30y0fPyRCimOG6aEOvwEHpR7JRJ/QQyYHxUvBK tOOcJQe9nfTUWDjm21saCkYsrbNijXmBXv+JLjJiytSzeV/kLpuAuo69Fv/xC3aRZySC XFVw== MIME-Version: 1.0 X-Received: by 10.224.20.72 with SMTP id e8mr50894397qab.104.1374773307162; Thu, 25 Jul 2013 10:28:27 -0700 (PDT) Sender: jakub.php@gmail.com Received: by 10.224.178.69 with HTTP; Thu, 25 Jul 2013 10:28:27 -0700 (PDT) In-Reply-To: References: Date: Thu, 25 Jul 2013 18:28:27 +0100 X-Google-Sender-Auth: MY7WciuzgEertSMDthTTL7_r0Tc Message-ID: To: Simon Schick Cc: Derick Rethans , PHP Internals List Content-Type: multipart/alternative; boundary=001a11c1bfea9ec5bf04e2595aa6 Subject: Re: [PHP-DEV] Adding a time interval to an interval From: bukka@php.net (Jakub Zelenka) --001a11c1bfea9ec5bf04e2595aa6 Content-Type: text/plain; charset=ISO-8859-1 On Mon, Jul 22, 2013 at 8:24 PM, Simon Schick wrote: > On Sun, Jul 21, 2013 at 6:14 PM, Jakub Zelenka wrote: > > On Tue, Jul 2, 2013 at 8:21 AM, Simon Schick > wrote: > >> > >> On Fri, Jun 28, 2013 at 11:20 PM, Derick Rethans > wrote: > >> > > >> > Hey Simon, > >> > > >> > PS, please don't top-reply as per mailinglist guidelines: > >> > http://us2.php.net/reST/README.MAILINGLIST_RULES > >> > > >> > On Fri, 28 Jun 2013, Simon Schick wrote: > >> > > On Fri, Jun 28, 2013 at 7:10 PM, Derick Rethans > >> > > wrote: > >> > > > >> > > > On Fri, 28 Jun 2013, Simon Schick wrote: > >> > > > > >> > > > > I'd like to extend the API of php by a method. > >> > > > > >> > > > Great, let me know if you need any help with the implementation, > or > >> > > > when you have any questions on how it currently works. > >> > > > >> > > Sorry - I that was easy to missunderstand ;) I thought of providing > >> > > the idea. But I would happily also try to implement it by my own - > >> > > just to also have contributed to the php-core. If you could give me > a > >> > > hint where to start - I feel quite lost in the code right now ... > even > >> > > so I read the great tutorials about php-internals provided by > Anthony > >> > > Ferrara. > >> > > > >> > > And this may take some time! I've just started with C/C++. > >> > > > >> > > Do you think this is an easy task to start? Depending on knowledge > of > >> > > php-internals ;) > >> > > >> > It's not that difficult, but not the easiest thing either. Basically, > >> > you have to do the following steps: > >> > > >> > 1. in ext/date/lib/interval.c add a function that has two arguments of > >> > the timelib_rel_time* type. It should return a *new* > >> > timelib_rel_time* structure that has the two intervals added up > >> > together. It shouldn't change either of the original > >> > timelib_rel_time* arguments. Add the function definition to > >> > ext/date/lib/timelib.h too. > >> > 2. You can only add two timelib_rel_time* arguments if neither of > >> > first_last_day_of, special, have_weekday_relative, and > >> > have_special_relative are set. You can'd add a "first day of next > >> > month" to a "+5 days" interval - it only works for simple y:m:d > h:i:s > >> > intervals. > >> > 3. In ext/date/php_date.c add: > >> > > >> > a. a new ARG_INFO struct after the one for > >> > arginfo_date_interval_construct, > >> > b. Add a new method, "add" after > >> > PHP_ME_MAPPING(createFromDateString, > >> > date_interval_create_from_date_string,... > >> > c. Add a new PHP_FUNCTION(date_interval_add) after the function > >> > PHP_FUNCTION(date_interval_format) that takes two DateInterval > >> > objects, extract the timelib_rel_time information, call the new > >> > function that you've added in step 1, and replace the > >> > timelib_rel_time* that is part of the DateInterval object with > the > >> > returned value. > >> > d. Add a forwards declaration to php_date.h after > >> > PHP_FUNCTION(date_interval_create_from_date_string); > >> > > >> > 4. Make sure that the function can be called both as a procedural way > >> > (date_interval_add) and an object oriented way > (DateInterval->add()). > >> > > >> > 5. Write test cases and put them in ext/date/tests. > >> > > >> > That's what I can think off right now. > >> > > >> > 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 > >> > >> Hi, Derick > >> > >> I thought a bit about the changes here and came up with the following > >> feedback: > >> > >> If I can't add intervals where either one is relative, I'd also add a > >> method isRelative() to the class, where the user can check if it's a > >> relative interval. > >> But anyways - what happens if the interval is relative and you try to > >> access one of the public properties? They're all designed for static > >> intervals (let's say +5days), right? > >> > >> What, if the user tries to add a relative to a fixed interval? Should > >> I trigger a E_WARNING, because it's no breaking error, but the value > >> can't be calculated? > >> > >> > >> Bye, > >> Simon > >> > >> -- > >> PHP Internals - PHP Runtime Development Mailing List > >> To unsubscribe, visit: http://www.php.net/unsub.php > >> > > > > > > Hi, > > > > > > here is the patch: https://github.com/php/php-src/pull/390 > > > > It's basically what Derick suggested. However there is one issue that > needs > > to be resolved - interval normalization (timelib_do_rel_normalize). The > > problem is that currently there is no way how to get a base timelib_time > > from the interval. It means that it's not possible to find out how many > days > > use for normalization. For example if interval1 is 20 days and interval2 > is > > 21 days, then the resulted normalized interval will be 1 month and ?? > > days... :) > > > > There are few solution that come to my mind: > > > > 1. no normalization (currently implemented) - this is the easiest > solution > > but the result from the example will be 0 months and 41 days can give > > interval that has over 31 days... > > 2. warning if the resulted interval has more than 28 days (February :) ) > > 3. save base timelib_time with the interval when created and then use it > as > > a base class - it will probably require some sort of copying or ref > counting > > but it seems like the most logical solution > > > > What do you think? > > > > Jakub > > Hi, Jakub > > Many thanks for the implementation. I haven't had the time to do it, > but would really have enjoyed it :) > > Now, I'll contribute by a comment: > I think, the most valuable result would be the first option. > > Reason: I can also create a date-interval for "90 days". > > Here's my example: > php > var_dump(DateInterval::createFromDateString("90 days")); > class DateInterval#3 (8) { > public $y => > int(0) > public $m => > int(0) > public $d => > int(90) > public $h => > int(0) > public $i => > int(0) > public $s => > int(0) > public $invert => > int(0) > public $days => > int(0) > } > > Adding or substracting some interval from this wouldn't be that > different as something like this: > > php > var_dump(DateInterval::createFromDateString("90 days and -3 > months")); > class DateInterval#3 (8) { > public $y => > int(0) > public $m => > int(-3) > public $d => > int(90) > public $h => > int(0) > public $i => > int(0) > public $s => > int(0) > public $invert => > int(0) > public $days => > int(0) > } > > I think, we shouldn't care, as long as both intervals are not relative > (like "next monday"). > > Btw ... wouldn't be that hard to add a "sub()" method to the class, > substracting a DateInterval ;) > > Bye > Simon > Hi Simon, Thanks for the feedback. I have just added the sub method: https://github.com/bukka/php-src/commit/88824d475cf8e8dd9b4fa4a09cb252f2f441acad We just need to wait for Derick when he gets time to review it :) Think that this is for 5.6 so we have got lots of time anyway... :) Cheers Jakub --001a11c1bfea9ec5bf04e2595aa6--