Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:68278 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 87299 invoked from network); 22 Jul 2013 19:24:36 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 22 Jul 2013 19:24:36 -0000 Authentication-Results: pb1.pair.com header.from=simonsimcity@gmail.com; sender-id=pass Authentication-Results: pb1.pair.com smtp.mail=simonsimcity@gmail.com; spf=pass; sender-id=pass Received-SPF: pass (pb1.pair.com: domain gmail.com designates 74.125.82.42 as permitted sender) X-PHP-List-Original-Sender: simonsimcity@gmail.com X-Host-Fingerprint: 74.125.82.42 mail-wg0-f42.google.com Received: from [74.125.82.42] ([74.125.82.42:61344] helo=mail-wg0-f42.google.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id 4B/ED-17597-2F68DE15 for ; Mon, 22 Jul 2013 15:24:35 -0400 Received: by mail-wg0-f42.google.com with SMTP id j13so1120280wgh.3 for ; Mon, 22 Jul 2013 12:24:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=ieHK3sjqyfpjoV+tSB0mDVPspP3EQwMDKT/6ItxV2q8=; b=HlCbCOa1S4sP77xG6MWbcrHN2ldJz+hkfBoT46E2FXxJZHmtYvKh/N/1DC28XSEx5o Qx7p9+pGJNkk6aP9Kg8lrGghPoNBLsOu0l8L7+1N0PJEX6x56npuyryyZktQgj2bjGPA xmQ34I6GK4bpehcKfGHzTQtQsBw7kWqpe8J+M8h9gN83GY9bwMwcsvQ/QabGA5jl6vbp 1aBER7Y2QdMqS/K9ZmZLwoMDgZsU+ngHfl47r0T1wgDrTwiPBgEzXs8KCbCkunz7AeNN um+ydOfz/ncwC0nwwBF2NKw4Y859UH38FX2xoPexbiYtvbqrMN7Z0UZZNcpvu8jgPa3S Ls6g== MIME-Version: 1.0 X-Received: by 10.194.9.101 with SMTP id y5mr20506679wja.86.1374521072246; Mon, 22 Jul 2013 12:24:32 -0700 (PDT) Received: by 10.194.63.200 with HTTP; Mon, 22 Jul 2013 12:24:32 -0700 (PDT) In-Reply-To: References: Date: Mon, 22 Jul 2013 21:24:32 +0200 Message-ID: To: Jakub Zelenka Cc: Derick Rethans , PHP Internals List Content-Type: text/plain; charset=UTF-8 Subject: Re: [PHP-DEV] Adding a time interval to an interval From: simonsimcity@gmail.com (Simon Schick) 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