[Bug #18922] Normalize time at 24:00:00 UTC
This commit is contained in:
parent
64cff78005
commit
68903df6f6
Notes:
git
2022-07-18 00:59:57 +09:00
Merged: https://github.com/ruby/ruby/pull/6146 Merged-By: nobu <nobu@ruby-lang.org>
@ -53,6 +53,8 @@ class TestTime < Test::Unit::TestCase
|
|||||||
assert_raise_with_message(ArgumentError, msg) { Time.new(2021, 1, 1, "+09:99") }
|
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, 1, "+09:99") }
|
||||||
assert_raise_with_message(ArgumentError, msg) { Time.new(2021, "+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
|
end
|
||||||
|
|
||||||
def test_time_add()
|
def test_time_add()
|
||||||
|
14
time.c
14
time.c
@ -654,6 +654,7 @@ static uint32_t month_arg(VALUE arg);
|
|||||||
static VALUE validate_utc_offset(VALUE utc_offset);
|
static VALUE validate_utc_offset(VALUE utc_offset);
|
||||||
static VALUE validate_zone_name(VALUE zone_name);
|
static VALUE validate_zone_name(VALUE zone_name);
|
||||||
static void validate_vtm(struct vtm *vtm);
|
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 uint32_t obj2subsecx(VALUE obj, VALUE *subsecx);
|
||||||
|
|
||||||
static VALUE time_gmtime(VALUE);
|
static VALUE time_gmtime(VALUE);
|
||||||
@ -2032,6 +2033,12 @@ vtm_add_offset(struct vtm *vtm, VALUE off, int sign)
|
|||||||
vtm->hour = hour;
|
vtm->hour = hour;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vtm_add_day(vtm, day);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
vtm_add_day(struct vtm *vtm, int day)
|
||||||
|
{
|
||||||
if (day) {
|
if (day) {
|
||||||
if (day < 0) {
|
if (day < 0) {
|
||||||
if (vtm->mon == 1 && vtm->mday == 1) {
|
if (vtm->mon == 1 && vtm->mday == 1) {
|
||||||
@ -2393,6 +2400,13 @@ time_init_args(rb_execution_context_t *ec, VALUE time, VALUE year, VALUE mon, VA
|
|||||||
|
|
||||||
if (utc == UTC_ZONE) {
|
if (utc == UTC_ZONE) {
|
||||||
tobj->timew = timegmw(&vtm);
|
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->vtm = vtm;
|
||||||
tobj->tm_got = 1;
|
tobj->tm_got = 1;
|
||||||
TZMODE_SET_UTC(tobj);
|
TZMODE_SET_UTC(tobj);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user