ruby-changes:73718
From: nagachika <ko1@a...>
Date: Sun, 25 Sep 2022 13:43:41 +0900 (JST)
Subject: [ruby-changes:73718] 13ee4b2c35 (ruby_3_1): merge revision(s) 68903df6f6fc548f3bf68fb09ee8b2495dcd28f0: [Backport #18922]
https://git.ruby-lang.org/ruby.git/commit/?id=13ee4b2c35 From 13ee4b2c35bad0f893d5ed5a6fdca62da406f958 Mon Sep 17 00:00:00 2001 From: nagachika <nagachika@r...> Date: Sun, 25 Sep 2022 12:38:51 +0900 Subject: merge revision(s) 68903df6f6fc548f3bf68fb09ee8b2495dcd28f0: [Backport #18922] [Bug #18922] Normalize time at 24:00:00 UTC --- test/ruby/test_time.rb | 2 ++ time.c | 14 ++++++++++++++ 2 files changed, 16 insertions(+) --- test/ruby/test_time.rb | 2 ++ time.c | 14 ++++++++++++++ version.h | 2 +- 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/test/ruby/test_time.rb b/test/ruby/test_time.rb index 2fdf0c2010..4a6ecea380 100644 --- a/test/ruby/test_time.rb +++ b/test/ruby/test_time.rb @@ -53,6 +53,8 @@ class TestTime < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_time.rb#L53 assert_raise_with_message(ArgumentError, msg) { Time.new(2021, 1, 1, "+09:99") } assert_raise_with_message(ArgumentError, msg) { Time.new(2021, 1, "+09:99") } assert_raise_with_message(ArgumentError, msg) { Time.new(2021, "+09:99") } + + assert_equal([0, 0, 0, 2, 1, 2000], Time.new(2000, 1, 1, 24, 0, 0, "-00:00").to_a[0, 6]) end def test_time_add() diff --git a/time.c b/time.c index 77f42fc89a..992e5403d0 100644 --- a/time.c +++ b/time.c @@ -654,6 +654,7 @@ static uint32_t month_arg(VALUE arg); https://github.com/ruby/ruby/blob/trunk/time.c#L654 static VALUE validate_utc_offset(VALUE utc_offset); static VALUE validate_zone_name(VALUE zone_name); static void validate_vtm(struct vtm *vtm); +static void vtm_add_day(struct vtm *vtm, int day); static uint32_t obj2subsecx(VALUE obj, VALUE *subsecx); static VALUE time_gmtime(VALUE); @@ -2025,6 +2026,12 @@ vtm_add_offset(struct vtm *vtm, VALUE off, int sign) https://github.com/ruby/ruby/blob/trunk/time.c#L2026 vtm->hour = hour; } + vtm_add_day(vtm, day); +} + +static void +vtm_add_day(struct vtm *vtm, int day) +{ if (day) { if (day < 0) { if (vtm->mon == 1 && vtm->mday == 1) { @@ -2386,6 +2393,13 @@ time_init_args(rb_execution_context_t *ec, VALUE time, VALUE year, VALUE mon, VA https://github.com/ruby/ruby/blob/trunk/time.c#L2393 if (utc == UTC_ZONE) { tobj->timew = timegmw(&vtm); + if (vtm.hour == 24) { /* special case: 24:00:00 only */ + /* Since no need to take care of DST in UTC, just reset + * hour and advance date, not to discard the validated + * vtm. */ + vtm.hour = 0; + vtm_add_day(&vtm, 1); + } tobj->vtm = vtm; tobj->tm_got = 1; TZMODE_SET_UTC(tobj); diff --git a/version.h b/version.h index 56ae0ef9b9..7f851815b0 100644 --- a/version.h +++ b/version.h @@ -11,7 +11,7 @@ https://github.com/ruby/ruby/blob/trunk/version.h#L11 # 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 57 +#define RUBY_PATCHLEVEL 58 #define RUBY_RELEASE_YEAR 2022 #define RUBY_RELEASE_MONTH 9 -- cgit v1.2.1 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/