Hi, all
I'd like to extend the API of php by a method.
Currently it is possible to create a DateInterval ... but if you have two
DateIntervals and want to "combine" them, you need to do it by your own.
I think it'd be a good idea to add a method for that to the DateInterval
class.
http://stackoverflow.com/questions/11556731/how-we-can-add-two-date-intervals-in-php
Bye,
Simon
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.
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
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 ;)
@Anthony, great thanks for the time writing the tutorials. (
http://blog.ircmaxell.com/search/label/PHP%20Source%20Code%20For%20PHP%20Developers%20Series
)
Bye,
Simon
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.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
Hey Simon,
PS, please don't top-reply as per mailinglist guidelines:
http://us2.php.net/reST/README.MAILINGLIST_RULES
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:
-
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. -
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. -
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); -
Make sure that the function can be called both as a procedural way
(date_interval_add) and an object oriented way (DateInterval->add()). -
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
Hey Simon,
PS, please don't top-reply as per mailinglist guidelines:
http://us2.php.net/reST/README.MAILINGLIST_RULESI'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:
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.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.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);Make sure that the function can be called both as a procedural way
(date_interval_add) and an object oriented way (DateInterval->add()).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
Hey Simon,
PS, please don't top-reply as per mailinglist guidelines:
http://us2.php.net/reST/README.MAILINGLIST_RULESOn Fri, Jun 28, 2013 at 7:10 PM, Derick Rethans derick@php.net
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:
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.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.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);Make sure that the function can be called both as a procedural way
(date_interval_add) and an object oriented way (DateInterval->add()).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: alpineHi, 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--
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:
- 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... - warning if the resulted interval has more than 28 days (February :) )
- 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
Hey Simon,
PS, please don't top-reply as per mailinglist guidelines:
http://us2.php.net/reST/README.MAILINGLIST_RULESOn Fri, Jun 28, 2013 at 7:10 PM, Derick Rethans derick@php.net
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:
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.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.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);Make sure that the function can be called both as a procedural way
(date_interval_add) and an object oriented way (DateInterval->add()).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: alpineHi, 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--
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:
- 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...- warning if the resulted interval has more than 28 days (February :) )
- 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 solutionWhat 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
On Mon, Jul 22, 2013 at 8:24 PM, Simon Schick simonsimcity@gmail.comwrote:
On Tue, Jul 2, 2013 at 8:21 AM, Simon Schick simonsimcity@gmail.com
wrote:On Fri, Jun 28, 2013 at 11:20 PM, Derick Rethans derick@php.net
wrote:Hey Simon,
PS, please don't top-reply as per mailinglist guidelines:
http://us2.php.net/reST/README.MAILINGLIST_RULESOn Fri, Jun 28, 2013 at 7:10 PM, Derick Rethans derick@php.net
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:
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.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.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);Make sure that the function can be called both as a procedural way
(date_interval_add) and an object oriented way
(DateInterval->add()).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: alpineHi, 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--
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:
- 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...- warning if the resulted interval has more than 28 days (February :) )
- 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 solutionWhat 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