From e6bf38a6e7fbae0097fdf51e3c752820a2c58ae4 Mon Sep 17 00:00:00 2001 From: nagachika Date: Sun, 7 Apr 2024 14:53:48 +0900 Subject: [PATCH] merge revision(s) d3279a0c11ca45ca85027e7eb74dc4aac52c478b: [Backport #20327] [Bug #20327] Do not count subsecond to calculate UTC offset Assume that there will never be any time zones with UTC offsets that are subseconds. Historically, UTC offset has only been used down to the second. --- test/ruby/test_time_tz.rb | 8 ++++++++ time.c | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) --- test/ruby/test_time_tz.rb | 8 ++++++++ time.c | 2 +- version.h | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/test/ruby/test_time_tz.rb b/test/ruby/test_time_tz.rb index 531d76b040..f66cd9bec2 100644 --- a/test/ruby/test_time_tz.rb +++ b/test/ruby/test_time_tz.rb @@ -695,6 +695,13 @@ module TestTimeTZ::WithTZ assert_equal(t.dst?, t2.dst?) end + def subtest_fractional_second(time_class, tz, tzarg, tzname, abbr, utc_offset) + t = time_class.new(2024, 1, 1, 23, 59, 59.9r, tzarg) + assert_equal(utc_offset[t.dst? ? 1 : 0], t.utc_offset) + t = time_class.new(2024, 7, 1, 23, 59, 59.9r, tzarg) + assert_equal(utc_offset[t.dst? ? 1 : 0], t.utc_offset) + end + def test_invalid_zone make_timezone("INVALID", "INV", 0) rescue => e @@ -719,6 +726,7 @@ module TestTimeTZ::WithTZ "Asia/Tokyo" => ["JST", +9*3600], "America/Los_Angeles" => ["PST", -8*3600, "PDT", -7*3600], "Africa/Ndjamena" => ["WAT", +1*3600], + "Etc/UTC" => ["UTC", 0], } def make_timezone(tzname, abbr, utc_offset, abbr2 = nil, utc_offset2 = nil) diff --git a/time.c b/time.c index 50bdb2bf6b..7f859d5eb4 100644 --- a/time.c +++ b/time.c @@ -2322,7 +2322,7 @@ zone_timelocal(VALUE zone, VALUE time) struct time_object *tobj = DATA_PTR(time); wideval_t t, s; - t = rb_time_unmagnify(tobj->timew); + split_second(tobj->timew, &t, &s); tm = tm_from_time(rb_cTimeTM, time); utc = rb_check_funcall(zone, id_local_to_utc, 1, &tm); if (UNDEF_P(utc)) return 0; diff --git a/version.h b/version.h index c99222f215..58facb62aa 100644 --- a/version.h +++ b/version.h @@ -11,7 +11,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 166 +#define RUBY_PATCHLEVEL 167 #include "ruby/version.h" #include "ruby/internal/abi.h"