Forum: Ruby Duration between two days

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Cee38055ae36590c654c04c2d5cc2778?d=identicon&s=25 Sky Yin (cookoo)
on 2006-01-14 16:54
(Received via mailing list)
According to the Rdoc of Date class, operator '-(x)' is described as:

If x is a Date <http://www.ruby-doc.org/core/classes/Date.html>, return
the
number of days between the two dates; or, more precisely, how many days
later the current date is than x.

However, a quick test in irb gives me a weird result:

>require 'date'
true
>a = Date.new 2004, 1, 1
#<Date: 4906011/2,0,2299161>
>b = Date.new 2004, 1, 3
#<Date: 4906015/2,0,2299161>
>b - a
Rational(2, 1)

Basic math tells me 2/1 = 2, so what's the point of returning Rational
instead of Fixnum here?

Thanks.
38a8230ed3d5c685558b4f0aad3fc74b?d=identicon&s=25 Joe Van Dyk (Guest)
on 2006-01-14 17:56
(Received via mailing list)
On 1/14/06, Sky Yin <sky.yin@gmail.com> wrote:
> >a = Date.new 2004, 1, 1
> #<Date: 4906011/2,0,2299161>
> >b = Date.new 2004, 1, 3
> #<Date: 4906015/2,0,2299161>
> >b - a
> Rational(2, 1)
>
> Basic math tells me 2/1 = 2, so what's the point of returning Rational
> instead of Fixnum here?

It's something to do with Astronomical Julian Days and fractional days.
430ea1cba106cc65b7687d66e9df4f06?d=identicon&s=25 David Vallner (Guest)
on 2006-01-15 00:32
(Received via mailing list)
On Sat, 14 Jan 2006 16:52:41 +0100, Sky Yin <sky.yin@gmail.com> wrote:

>
> Basic math tells me 2/1 = 2, so what's the point of returning Rational
> instead of Fixnum here?
>

Because the code calculates in rationals?

You might want to 'require "mathn"' on the beginning of the script if it
bugs you, the module causes Ruby math to work more... err...
mathemathically. E.g.:

irb(main):001:0> Rational(2, 1)
=> Rational(2, 1)
irb(main):002:0> require "mathn"
=> true
irb(main):003:0> Rational(2, 1)
=> 2

As always after doing deeper magic, be on the lookout for bugs the
module
could introduce.

David Vallner
Cee38055ae36590c654c04c2d5cc2778?d=identicon&s=25 Sky Yin (cookoo)
on 2006-01-15 03:31
(Received via mailing list)
Thanks, Joe and David. Although I don't quite understand the science
behind
that, add a bit more ".to_i" is enough for me.
9a46755c817121b0571a563e5ab02090?d=identicon&s=25 Brian Buckley (brian)
on 2006-01-15 07:13
(Received via mailing list)
> irb(main):002:0> require "mathn"


Though getting a Rational back is not incorrect, clearly getting a
Fixnum
back would be one's initial expectation.

Interesting that 'mathn' caused a change in return type.  I suppose that
means the return type is not part of the date subtraction contract.  I
quickly eyeballed mathn.rb to try to see the specific reason for the
change
in return type.  My guess if that Date - Date uses the ** operator
because
** is redefined in mathn.


Brian Buckley
E34b5cae57e0dd170114dba444e37852?d=identicon&s=25 Logan Capaldo (Guest)
on 2006-01-15 07:26
(Received via mailing list)
On Jan 15, 2006, at 1:12 AM, Brian Buckley wrote:

> quickly eyeballed mathn.rb to try to see the specific reason for
> the change
> in return type.  My guess if that Date - Date uses the ** operator
> because
> ** is redefined in mathn.
>
>
> Brian Buckley

Requiring mathn did not change the return type. Requiring mathn
changed how rationals display themselves (ie it changed
Rational#inspect). (It also changed Integer#/ to return rationals
instead of Integers, among other things I am sure)
9a46755c817121b0571a563e5ab02090?d=identicon&s=25 Brian Buckley (brian)
on 2006-01-15 15:40
(Received via mailing list)
>
> Requiring mathn did not change the return type. Requiring mathn
> changed how rationals display themselves


I think the return type is changed, not just how Rationals are
displayed.

(date2 - date1).class  # => Rational
require 'mathn'
(date2 - date1).class  # => Fixnum
430ea1cba106cc65b7687d66e9df4f06?d=identicon&s=25 David Vallner (Guest)
on 2006-01-15 17:10
(Received via mailing list)
On Sun, 15 Jan 2006 07:12:26 +0100, Brian Buckley
<briankbuckley@gmail.com> wrote:

> in return type.  My guess if that Date - Date uses the ** operator
> because
> ** is redefined in mathn.
>
>
> Brian Buckley


Yes, the change of return type is intentional - from skimming the source
code, aside from the newly defined features, it seems mathn tweaks some
flags to make Rational and Complex always unify to Integers if possible,
and aliases Integer#/ for division of Integers to return Rationals. The
latter might NOT be what you might want if you're used to the (IMO
illogical) C behaviour of using integral division instead. mathn doesn't
redefine Rational#**, it defines it in the first place.

The date substraction contract is not violated, because Integers should
have the same contract for every operation they share with Rationals of
the same value. If that's not the case, it could be considered a bug in
the Ruby core API.

David Vallner
This topic is locked and can not be replied to.