diff --git a/icu4c/source/i18n/calendar.cpp b/icu4c/source/i18n/calendar.cpp index a296599ef5d2..4b6edc87c914 100644 --- a/icu4c/source/i18n/calendar.cpp +++ b/icu4c/source/i18n/calendar.cpp @@ -636,7 +636,7 @@ static const int32_t kCalendarLimits[UCAL_FIELD_COUNT][4] = { { 0, 0, 59, 59 }, // MINUTE { 0, 0, 59, 59 }, // SECOND { 0, 0, 999, 999 }, // MILLISECOND - {-16*kOneHour, -16*kOneHour, 12*kOneHour, 30*kOneHour }, // ZONE_OFFSET + {-24*kOneHour, -16*kOneHour, 12*kOneHour, 30*kOneHour }, // ZONE_OFFSET { -1*kOneHour, -1*kOneHour, 2*kOneHour, 2*kOneHour }, // DST_OFFSET {/*N/A*/-1, /*N/A*/-1, /*N/A*/-1, /*N/A*/-1}, // YEAR_WOY { 1, 1, 7, 7 }, // DOW_LOCAL diff --git a/icu4c/source/test/intltest/tztest.cpp b/icu4c/source/test/intltest/tztest.cpp index 046bef287043..fc9793a8e669 100644 --- a/icu4c/source/test/intltest/tztest.cpp +++ b/icu4c/source/test/intltest/tztest.cpp @@ -80,6 +80,7 @@ void TimeZoneTest::runIndexedTest( int32_t index, UBool exec, const char* &name, TESTCASE_AUTO(TestCasablancaNameAndOffset22041); TESTCASE_AUTO(TestRawOffsetAndOffsetConsistency22041); TESTCASE_AUTO(TestGetIanaID); + TESTCASE_AUTO(TestGMTMinus24ICU22526); TESTCASE_AUTO_END; } @@ -2664,4 +2665,13 @@ void TimeZoneTest::TestGetIanaID() { } } } + +void TimeZoneTest::TestGMTMinus24ICU22526() { + UErrorCode status = U_ZERO_ERROR; + LocalPointer tz(TimeZone::createTimeZone("GMT-23:59"), status); + U_ASSERT(U_SUCCESS(status)); + GregorianCalendar gc(tz.orphan(), status); + gc.setTime(123456789, status); + gc.get(UCAL_MONTH, status); +} #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icu4c/source/test/intltest/tztest.h b/icu4c/source/test/intltest/tztest.h index 319e6dd38d49..fa51d628a8ca 100644 --- a/icu4c/source/test/intltest/tztest.h +++ b/icu4c/source/test/intltest/tztest.h @@ -105,6 +105,7 @@ class TimeZoneTest: public CalendarTimeZoneTest { void TestGetIDForWindowsID(); void TestCasablancaNameAndOffset22041(); void TestRawOffsetAndOffsetConsistency22041(); + void TestGMTMinus24ICU22526(); void TestGetIanaID(); diff --git a/icu4j/main/core/src/main/java/com/ibm/icu/util/Calendar.java b/icu4j/main/core/src/main/java/com/ibm/icu/util/Calendar.java index 52fa70f26be8..6150dae474cf 100644 --- a/icu4j/main/core/src/main/java/com/ibm/icu/util/Calendar.java +++ b/icu4j/main/core/src/main/java/com/ibm/icu/util/Calendar.java @@ -4581,7 +4581,7 @@ public int getMinimalDaysInFirstWeek() { 0, 0, 59, 59 }, // MINUTE { 0, 0, 59, 59 }, // SECOND { 0, 0, 999, 999 }, // MILLISECOND - {-16*ONE_HOUR, -16*ONE_HOUR, 12*ONE_HOUR, 30*ONE_HOUR }, // ZONE_OFFSET + {-24*ONE_HOUR, -16*ONE_HOUR, 12*ONE_HOUR, 30*ONE_HOUR }, // ZONE_OFFSET { 0, 0, 2*ONE_HOUR, 2*ONE_HOUR }, // DST_OFFSET {/* */}, // YEAR_WOY { 1, 1, 7, 7 }, // DOW_LOCAL diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/timezone/TimeZoneTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/timezone/TimeZoneTest.java index abc52bd87845..e51e7ee521eb 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/timezone/TimeZoneTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/timezone/TimeZoneTest.java @@ -2419,6 +2419,13 @@ public void TestGetIanaID() { } } } + @Test + public void TestGMTMinus24ICU22526() { + TimeZone tz = TimeZone.getTimeZone("GMT-23:59"); + GregorianCalendar gc = new GregorianCalendar(tz); + gc.setTimeInMillis(123456789); + gc.get(GregorianCalendar.MONTH); + } } //eof