1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

[ruby/date] Make julian dates roundtrip through to_time.to_date

Previously, julian dates would not round trip through to_time.to_date,
because Time is always considered gregorian.  This converts the Date
instance from julian to gregorian before converting to Time, ensuring
that an equal date object will be returned if converting that Time
back to Date.

This does result in julian Date objects showing different day values
if converting to Time.

Fixes Ruby Bug 8428.

https://github.com/ruby/date/commit/d8df64555e
This commit is contained in:
Jeremy Evans 2019-07-17 14:53:55 -07:00 committed by Hiroshi SHIBATA
parent f1de438380
commit 9eb798a3f1
No known key found for this signature in database
GPG key ID: F9CF13417264FAC2
2 changed files with 30 additions and 5 deletions

View file

@ -8555,17 +8555,24 @@ time_to_datetime(VALUE self)
* call-seq: * call-seq:
* d.to_time -> time * d.to_time -> time
* *
* Returns a Time object which denotes self. * Returns a Time object which denotes self. If self is a julian date,
* convert it to a gregorian date before converting it to Time.
*/ */
static VALUE static VALUE
date_to_time(VALUE self) date_to_time(VALUE self)
{ {
get_d1(self); get_d1a(self);
if (m_julian_p(adat)) {
VALUE tmp = d_lite_gregorian(self);
get_d1b(tmp);
adat = bdat;
}
return f_local3(rb_cTime, return f_local3(rb_cTime,
m_real_year(dat), m_real_year(adat),
INT2FIX(m_mon(dat)), INT2FIX(m_mon(adat)),
INT2FIX(m_mday(dat))); INT2FIX(m_mday(adat)));
} }
/* /*

View file

@ -48,6 +48,24 @@ class TestDateConv < Test::Unit::TestCase
[t.year, t.mon, t.mday, t.hour, t.min, t.sec, t.usec]) [t.year, t.mon, t.mday, t.hour, t.min, t.sec, t.usec])
end end
def test_to_time_to_date_roundtrip__from_gregorian_date
d = Date.new(1582, 10, 15)
t = d.to_time
assert_equal([1582, 10, 15, 0, 0, 0, 0],
[t.year, t.mon, t.mday, t.hour, t.min, t.sec, t.usec])
assert_equal(d, t.to_date)
assert_equal(d.jd, t.to_date.jd)
end
def test_to_time_to_date_roundtrip__from_julian_date
d = Date.new(1582, 10, 4)
t = d.to_time
assert_equal([1582, 10, 14, 0, 0, 0, 0],
[t.year, t.mon, t.mday, t.hour, t.min, t.sec, t.usec])
assert_equal(d, t.to_date)
assert_equal(d.jd, t.to_date.jd)
end
def test_to_time__from_datetime def test_to_time__from_datetime
d = DateTime.new(2004, 9, 19, 1, 2, 3, 8.to_r/24) + 456789.to_r/86400000000 d = DateTime.new(2004, 9, 19, 1, 2, 3, 8.to_r/24) + 456789.to_r/86400000000
t = d.to_time t = d.to_time