]> granicus.if.org Git - icu/commitdiff
ICU-22043 Change minimum ZONE_OFFSET value from -12h to -16h
authorFrank Tang <ftang@chromium.org>
Tue, 24 May 2022 04:16:01 +0000 (04:16 +0000)
committerFrank Yung-Fong Tang <ftang@google.com>
Tue, 24 May 2022 23:11:39 +0000 (16:11 -0700)
See #2100

icu4c/source/i18n/calendar.cpp
icu4c/source/test/intltest/calregts.cpp
icu4c/source/test/intltest/calregts.h
icu4j/main/classes/core/src/com/ibm/icu/util/Calendar.java

index 0f5bf52219e2a0c134fadfd95f1f0c918764b9b8..11bc19a69260350fdfd234a0d3fa24f27a10dab5 100644 (file)
@@ -639,7 +639,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
-    {-12*kOneHour, -12*kOneHour,   12*kOneHour,   30*kOneHour  }, // ZONE_OFFSET
+    {-16*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
index 930f5032969a8454d3c0a813873a780e4197d510..e4420d715e4b7fac01875acc1aad90dd4bc5ff0a 100644 (file)
@@ -98,6 +98,7 @@ CalendarRegressionTest::runIndexedTest( int32_t index, UBool exec, const char* &
         CASE(54,TestWeekOfYear13548);
         CASE(55,Test13745);
         CASE(56,TestUTCWrongAMPM22023);
+        CASE(57,TestAsiaManilaAfterSetGregorianChange22043);
     default: name = ""; break;
     }
 }
@@ -3189,6 +3190,40 @@ void CalendarRegressionTest::TestUTCWrongAMPM22023(void) {
     VerifyGetStayInBound(-1e-15);
 }
 
+void CalendarRegressionTest::VerifyNoAssertWithSetGregorianChange(const char* timezone) {
+    UErrorCode status = U_ZERO_ERROR;
+    std::unique_ptr<Calendar> cal(
+        Calendar::createInstance(
+            TimeZone::createTimeZone(UnicodeString(timezone, -1, US_INV)),
+            Locale::getEnglish(),
+            status));
+    cal->setTime(Calendar::getNow(), status);
+
+    if (cal->getDynamicClassID() ==
+        GregorianCalendar::getStaticClassID()) {
+        GregorianCalendar* gc =
+            static_cast<GregorianCalendar*>(cal.get());
+        // The beginning of ECMAScript time, namely -(2**53)
+        const double start_of_time = -9007199254740992;
+        gc->setGregorianChange(start_of_time, status);
+    }
+    cal->get(UCAL_YEAR, status);
+}
+
+void CalendarRegressionTest::TestAsiaManilaAfterSetGregorianChange22043(void) {
+    VerifyNoAssertWithSetGregorianChange("Asia/Malina");
+    UErrorCode status = U_ZERO_ERROR;
+    std::unique_ptr<StringEnumeration> ids(TimeZone::createEnumeration(status));
+    if (U_FAILURE(status)) {
+        errln("TimeZone::createEnumeration failed");
+        return;
+    }
+    const char* id;
+    while ((id = ids->next(nullptr, status)) != nullptr && U_SUCCESS(status)) {
+        VerifyNoAssertWithSetGregorianChange(id);
+    }
+}
+
 void CalendarRegressionTest::TestWeekOfYear13548(void) {
     int32_t year = 2000;
     UErrorCode status = U_ZERO_ERROR;
index 9581eac20b918f29f02c7a94b8eaef0be30b86b2..da815fb448e014f8007c40c9fa312f357ee920da 100644 (file)
@@ -82,6 +82,7 @@ public:
     void TestIslamicCalOverflow(void);
     void TestWeekOfYear13548(void);
     void TestUTCWrongAMPM22023(void);
+    void TestAsiaManilaAfterSetGregorianChange22043(void);
 
     void Test13745(void);
 
@@ -89,6 +90,7 @@ public:
     void dowTest(UBool lenient) ;
 
     void VerifyGetStayInBound(double test_value);
+    void VerifyNoAssertWithSetGregorianChange(const char* timezone);
 
     static UDate getAssociatedDate(UDate d, UErrorCode& status);
     static UDate makeDate(int32_t y, int32_t m = 0, int32_t d = 0, int32_t hr = 0, int32_t min = 0, int32_t sec = 0);
index 53167ecc66758c8ad11059759ca38a54c2828b66..9a86b8a549c05c6cc9e12e73ba9956a7db5ef2db 100644 (file)
@@ -4337,8 +4337,8 @@ public abstract class Calendar implements Serializable, Cloneable, Comparable<Ca
         {           0,            0,            59,            59  }, // MINUTE
         {           0,            0,            59,            59  }, // SECOND
         {           0,            0,           999,           999  }, // MILLISECOND
-        {-12*ONE_HOUR, -12*ONE_HOUR,   12*ONE_HOUR,   12*ONE_HOUR  }, // ZONE_OFFSET
-        {           0,            0,    1*ONE_HOUR,    1*ONE_HOUR  }, // DST_OFFSET
+        {-16*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
         {/*                                                      */}, // EXTENDED_YEAR