diff options
author | nagachika <nagachika@ruby-lang.org> | 2021-03-20 14:43:10 +0900 |
---|---|---|
committer | nagachika <nagachika@ruby-lang.org> | 2021-03-20 14:43:10 +0900 |
commit | a85982553935b81de02eb8cca9476df5d4442fd8 (patch) | |
tree | 476f7e4cb376356a1ac702c20f83dbb56d96f03f | |
parent | 82d72f14e7071218f3fd710f770d1ba31390f027 (diff) |
merge revision(s) 276f6a225d18561cbe5282b798cb4e416c66079f,95bef7b69a6fb42687a6200b338060be307259f5: [Backport #17352]
Don't double fractional seconds when passing timezone object to
Time.new
I found that fractional seconds were doubled when using the timezone
feature of Time in Sequel's named_timezones extension (which uses
TZInfo for the timezone object), and traced the problem to this code.
There is no subsecx being modified in the utc_to_local call below
this, and I'm not sure why you would want to add in the fractional
seconds unless you assumed the timezone conversion would drop the
existing fractional seconds (TZInfo doesn't drop fractional seconds).
---
test/ruby/test_time_tz.rb | 10 ++++++++++
1 file changed, 10 insertions(+)
Subsecond of Time::tm should be 0
---
time.c | 1 +
1 file changed, 1 insertion(+)
-rw-r--r-- | test/ruby/test_time_tz.rb | 10 | ||||
-rw-r--r-- | time.c | 1 | ||||
-rw-r--r-- | version.h | 2 |
3 files changed, 12 insertions, 1 deletions
diff --git a/test/ruby/test_time_tz.rb b/test/ruby/test_time_tz.rb index 7f0a306783..5ee12e4dbd 100644 --- a/test/ruby/test_time_tz.rb +++ b/test/ruby/test_time_tz.rb @@ -749,6 +749,16 @@ class TestTimeTZ::DummyTZ < Test::Unit::TestCase def self.make_timezone(tzname, abbr, utc_offset, abbr2 = nil, utc_offset2 = nil) TestTimeTZ::TZ.new(tzname, abbr, utc_offset, abbr2, utc_offset2) end + + def test_fractional_second + x = Object.new + def x.local_to_utc(t); t + 8*3600; end + def x.utc_to_local(t); t - 8*3600; end + + t1 = Time.new(2020,11,11,12,13,14.124r, '-08:00') + t2 = Time.new(2020,11,11,12,13,14.124r, x) + assert_equal(t1, t2) + end end begin @@ -5470,6 +5470,7 @@ tm_from_time(VALUE klass, VALUE time) ttm = DATA_PTR(tm); v = &vtm; GMTIMEW(ttm->timew = tobj->timew, v); + ttm->timew = wsub(ttm->timew, v->subsecx); v->subsecx = INT2FIX(0); v->zone = Qnil; ttm->vtm = *v; @@ -2,7 +2,7 @@ # define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR #define RUBY_VERSION_TEENY 3 #define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR -#define RUBY_PATCHLEVEL 169 +#define RUBY_PATCHLEVEL 170 #define RUBY_RELEASE_YEAR 2021 #define RUBY_RELEASE_MONTH 3 |