mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
[ruby/date] Fix Time#to_datetime before calendar reform
Time is always in the proleptic Gregorian calendar. Also DateTime#to_time should convert to the Gregorian calendar first, before extracting its components. https://bugs.ruby-lang.org/issues/18946#change-98527 https://github.com/ruby/date/commit/b2aee75248
This commit is contained in:
parent
43239b23b4
commit
e07d450dea
2 changed files with 26 additions and 4 deletions
|
@ -8811,7 +8811,7 @@ time_to_datetime(VALUE self)
|
|||
ret = d_complex_new_internal(cDateTime,
|
||||
nth, 0,
|
||||
0, sf,
|
||||
of, DEFAULT_SG,
|
||||
of, GREGORIAN,
|
||||
ry, m, d,
|
||||
h, min, s,
|
||||
HAVE_CIVIL | HAVE_TIME);
|
||||
|
@ -8915,12 +8915,17 @@ date_to_datetime(VALUE self)
|
|||
static VALUE
|
||||
datetime_to_time(VALUE self)
|
||||
{
|
||||
volatile VALUE dup = dup_obj(self);
|
||||
get_d1(self);
|
||||
|
||||
if (m_julian_p(dat)) {
|
||||
self = d_lite_gregorian(self);
|
||||
get_d1a(self);
|
||||
dat = adat;
|
||||
}
|
||||
|
||||
{
|
||||
VALUE t;
|
||||
|
||||
get_d1(dup);
|
||||
|
||||
t = rb_funcall(rb_cTime,
|
||||
rb_intern("new"),
|
||||
7,
|
||||
|
|
|
@ -77,6 +77,11 @@ class TestDateConv < Test::Unit::TestCase
|
|||
assert_equal([2004, 9, 19, 1, 2, 3, 456789],
|
||||
[t.year, t.mon, t.mday, t.hour, t.min, t.sec, t.usec])
|
||||
|
||||
d = DateTime.new(1582, 10, 3, 1, 2, 3, 0) + 456789.to_r/86400000000
|
||||
t = d.to_time.utc
|
||||
assert_equal([1582, 10, 13, 1, 2, 3, 456789],
|
||||
[t.year, t.mon, t.mday, t.hour, t.min, t.sec, t.usec])
|
||||
|
||||
if Time.allocate.respond_to?(:nsec)
|
||||
d = DateTime.new(2004, 9, 19, 1, 2, 3, 0) + 456789123.to_r/86400000000000
|
||||
t = d.to_time.utc
|
||||
|
@ -100,6 +105,10 @@ class TestDateConv < Test::Unit::TestCase
|
|||
t = Time.utc(2004, 9, 19, 1, 2, 3, 456789)
|
||||
d = t.to_date
|
||||
assert_equal([2004, 9, 19, 0], [d.year, d.mon, d.mday, d.day_fraction])
|
||||
|
||||
t = Time.utc(1582, 10, 13, 1, 2, 3, 456789)
|
||||
d = t.to_date # using ITALY
|
||||
assert_equal([1582, 10, 3, 0], [d.year, d.mon, d.mday, d.day_fraction])
|
||||
end
|
||||
|
||||
def test_to_date__from_date
|
||||
|
@ -136,6 +145,14 @@ class TestDateConv < Test::Unit::TestCase
|
|||
[d.year, d.mon, d.mday, d.hour, d.min, d.sec,
|
||||
d.sec_fraction, d.offset])
|
||||
|
||||
t = Time.utc(1582, 10, 13, 1, 2, 3, 456789)
|
||||
d = t.to_datetime # using ITALY
|
||||
assert_equal([1582, 10, 3, 1, 2, 3,
|
||||
456789.to_r/1000000,
|
||||
0],
|
||||
[d.year, d.mon, d.mday, d.hour, d.min, d.sec,
|
||||
d.sec_fraction, d.offset])
|
||||
|
||||
t = Time.now
|
||||
d = t.to_datetime
|
||||
require 'time'
|
||||
|
|
Loading…
Reference in a new issue