1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
ruby--ruby/test/date/test_date_conv.rb
Nobuyoshi Nakada e07d450dea [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
2022-08-08 23:50:17 +09:00

188 lines
5.7 KiB
Ruby

# frozen_string_literal: true
require 'test/unit'
require 'date'
class TestDateConv < Test::Unit::TestCase
def with_tz(tz)
old = ENV["TZ"]
begin
ENV["TZ"] = tz
yield
ensure
ENV["TZ"] = old
end
end
def test_to_class
[Time.now, Date.today, DateTime.now].each do |o|
assert_instance_of(Time, o.to_time)
assert_instance_of(Date, o.to_date)
assert_instance_of(DateTime, o.to_datetime)
end
end
def test_to_time__from_time
t = Time.mktime(2004, 9, 19, 1, 2, 3, 456789)
t2 = t.to_time
assert_equal([2004, 9, 19, 1, 2, 3, 456789],
[t2.year, t2.mon, t2.mday, t2.hour, t2.min, t2.sec, t2.usec])
t = Time.utc(2004, 9, 19, 1, 2, 3, 456789)
t2 = t.to_time.utc
assert_equal([2004, 9, 19, 1, 2, 3, 456789],
[t2.year, t2.mon, t2.mday, t2.hour, t2.min, t2.sec, t2.usec])
t = Time.new(2004, 9, 19, 1, 2, 3, '+03:00')
with_tz('Asia/Tokyo') do
t2 = t.to_time
assert_equal([2004, 9, 19, 1, 2, 3],
[t2.year, t2.mon, t2.mday, t2.hour, t2.min, t2.sec])
assert_equal(3 * 60 * 60, t2.gmt_offset)
end
end
def test_to_time__from_date
d = Date.new(2004, 9, 19)
t = d.to_time
assert_equal([2004, 9, 19, 0, 0, 0, 0],
[t.year, t.mon, t.mday, t.hour, t.min, t.sec, t.usec])
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
d = DateTime.new(2004, 9, 19, 1, 2, 3, 8.to_r/24) + 456789.to_r/86400000000
t = d.to_time
assert_equal([2004, 9, 19, 1, 2, 3, 456789, 8*60*60],
[t.year, t.mon, t.mday, t.hour, t.min, t.sec, t.usec, t.utc_offset])
d = DateTime.new(2004, 9, 19, 1, 2, 3, 0) + 456789.to_r/86400000000
t = d.to_time.utc
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
assert_equal([2004, 9, 19, 1, 2, 3, 456789123],
[t.year, t.mon, t.mday, t.hour, t.min, t.sec, t.nsec])
end
if Time.allocate.respond_to?(:subsec)
d = DateTime.new(2004, 9, 19, 1, 2, 3, 0) + 456789123456789123.to_r/86400000000000000000000
t = d.to_time.utc
assert_equal([2004, 9, 19, 1, 2, 3, Rational(456789123456789123,1000000000000000000)],
[t.year, t.mon, t.mday, t.hour, t.min, t.sec, t.subsec])
end
end
def test_to_date__from_time
t = Time.mktime(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(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
d = Date.new(2004, 9, 19) + 1.to_r/2
d2 = d.to_date
assert_equal([2004, 9, 19, 1.to_r/2],
[d2.year, d2.mon, d2.mday, d2.day_fraction])
end
def test_to_date__from_datetime
d = DateTime.new(2004, 9, 19, 1, 2, 3, 9.to_r/24) + 456789.to_r/86400000000
d2 = d.to_date
assert_equal([2004, 9, 19, 0], [d2.year, d2.mon, d2.mday, d2.day_fraction])
d = DateTime.new(2004, 9, 19, 1, 2, 3, 0) + 456789.to_r/86400000000
d2 = d.to_date
assert_equal([2004, 9, 19, 0], [d2.year, d2.mon, d2.mday, d2.day_fraction])
end
def test_to_datetime__from_time
t = Time.mktime(2004, 9, 19, 1, 2, 3, 456789)
d = t.to_datetime
assert_equal([2004, 9, 19, 1, 2, 3,
456789.to_r/1000000,
t.utc_offset.to_r/86400],
[d.year, d.mon, d.mday, d.hour, d.min, d.sec,
d.sec_fraction, d.offset])
t = Time.utc(2004, 9, 19, 1, 2, 3, 456789)
d = t.to_datetime
assert_equal([2004, 9, 19, 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.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'
assert_equal(t.iso8601(10), d.iso8601(10))
end
def test_to_datetime__from_date
d = Date.new(2004, 9, 19) + 1.to_r/2
d2 = d.to_datetime
assert_equal([2004, 9, 19, 0, 0, 0, 0, 0],
[d2.year, d2.mon, d2.mday, d2.hour, d2.min, d2.sec,
d2.sec_fraction, d2.offset])
end
def test_to_datetime__from_datetime
d = DateTime.new(2004, 9, 19, 1, 2, 3, 9.to_r/24) + 456789.to_r/86400000000
d2 = d.to_datetime
assert_equal([2004, 9, 19, 1, 2, 3,
456789.to_r/1000000,
9.to_r/24],
[d2.year, d2.mon, d2.mday, d2.hour, d2.min, d2.sec,
d2.sec_fraction, d2.offset])
d = DateTime.new(2004, 9, 19, 1, 2, 3, 0) + 456789.to_r/86400000000
d2 = d.to_datetime
assert_equal([2004, 9, 19, 1, 2, 3,
456789.to_r/1000000,
0],
[d2.year, d2.mon, d2.mday, d2.hour, d2.min, d2.sec,
d2.sec_fraction, d2.offset])
end
end