]> granicus.if.org Git - icu/commitdiff
ICU-22041 Fix "Africa/Casablanca" show strange LONG displayName
authorFrank Tang <ftang@chromium.org>
Thu, 26 May 2022 18:15:27 +0000 (18:15 +0000)
committerFrank Yung-Fong Tang <ftang@google.com>
Thu, 26 May 2022 21:59:10 +0000 (14:59 -0700)
See #2096

icu4c/source/i18n/olsontz.cpp
icu4c/source/i18n/rbtz.cpp
icu4c/source/test/intltest/tztest.cpp
icu4c/source/test/intltest/tztest.h
icu4j/main/tests/core/src/com/ibm/icu/dev/test/timezone/TimeZoneTest.java

index cae471a5a25c6019be7d3ad6ae4ccd13afd5b017..0f06db5c7510d26fe9fd625e83b42f12a8cceefd 100644 (file)
@@ -430,8 +430,7 @@ void OlsonTimeZone::setRawOffset(int32_t /*offsetMillis*/) {
 int32_t OlsonTimeZone::getRawOffset() const {
     UErrorCode ec = U_ZERO_ERROR;
     int32_t raw, dst;
-    getOffset((double) uprv_getUTCtime() * U_MILLIS_PER_SECOND,
-              FALSE, raw, dst, ec);
+    getOffset(uprv_getUTCtime(), FALSE, raw, dst, ec);
     return raw;
 }
 
index 495d8310d0029830c9d54ee8d2137179b212e14d..7eba471a713a01dc16017f53be831126e9378444 100644 (file)
@@ -479,8 +479,7 @@ RuleBasedTimeZone::getRawOffset(void) const {
     // as of current time.
     UErrorCode status = U_ZERO_ERROR;
     int32_t raw, dst;
-    getOffset(uprv_getUTCtime() * U_MILLIS_PER_SECOND,
-        FALSE, raw, dst, status);
+    getOffset(uprv_getUTCtime(), FALSE, raw, dst, status);
     return raw;
 }
 
@@ -490,7 +489,7 @@ RuleBasedTimeZone::useDaylightTime(void) const {
     // daylight saving time is used as of now or
     // after the next transition.
     UErrorCode status = U_ZERO_ERROR;
-    UDate now = uprv_getUTCtime() * U_MILLIS_PER_SECOND;
+    UDate now = uprv_getUTCtime();
     int32_t raw, dst;
     getOffset(now, FALSE, raw, dst, status);
     if (dst != 0) {
index 5ae9ae7175c9edca909786c6c1ac3237962e2ef3..d949276b9e72b8071307a9cdf4784f8b81e24075 100644 (file)
@@ -76,6 +76,8 @@ void TimeZoneTest::runIndexedTest( int32_t index, UBool exec, const char* &name,
     TESTCASE_AUTO(TestGetGMT);
     TESTCASE_AUTO(TestGetWindowsID);
     TESTCASE_AUTO(TestGetIDForWindowsID);
+    TESTCASE_AUTO(TestCasablancaNameAndOffset22041);
+    TESTCASE_AUTO(TestRawOffsetAndOffsetConsistency22041);
     TESTCASE_AUTO_END;
 }
 
@@ -2544,4 +2546,41 @@ void TimeZoneTest::TestGetIDForWindowsID(void) {
     }
 }
 
+void TimeZoneTest::TestCasablancaNameAndOffset22041(void) {
+    std::unique_ptr<TimeZone> zone(TimeZone::createTimeZone("Africa/Casablanca"));
+    UnicodeString standardName, summerName;
+    zone->getDisplayName(false, TimeZone::LONG, Locale::getEnglish(), standardName);
+    zone->getDisplayName(true, TimeZone::LONG, Locale::getEnglish(), summerName);
+    int32_t raw, dst;
+    UErrorCode status = U_ZERO_ERROR;
+    zone->getOffset(Calendar::getNow(), false, raw, dst, status);
+    assertEquals(u"TimeZone name for Africa/Casablanca should not contain '+02' since it is located in UTC, but got "
+                 + standardName, -1, standardName.indexOf("+02"));
+    assertEquals(u"TimeZone name for Africa/Casablanca should not contain '+02' since it is located in UTC, but got "
+                 + summerName, -1, summerName.indexOf("+02"));
+    assertEquals("getRawOffset() and the raw from getOffset(now, false, raw, dst, status) should not be different but got",
+                 zone->getRawOffset(), raw);
+}
+
+void TimeZoneTest::TestRawOffsetAndOffsetConsistency22041(void) {
+    UErrorCode status = U_ZERO_ERROR;
+    LocalPointer<StringEnumeration> s(TimeZone::createEnumeration(status));
+    if (U_FAILURE(status)) {
+        dataerrln("Unable to create TimeZone enumeration");
+        return;
+    }
+    const char* tz;
+    UDate now = Calendar::getNow();
+    while ((tz = s->next(nullptr, status)) != nullptr && U_SUCCESS(status)) {
+        std::unique_ptr<TimeZone> zone(TimeZone::createTimeZone(tz));
+        int32_t raw, dst;
+        zone->getOffset(now, false, raw, dst, status);
+        if (U_FAILURE(status)) {
+           errln("TimeZone '%s' getOffset() return error", tz);
+        }
+        assertEquals(u"TimeZone '" + UnicodeString(tz) +
+                     u"' getRawOffset() and the raw from getOffset(now, false, raw, dst, status) should not be different but got",
+                     zone->getRawOffset(), raw);
+    }
+}
 #endif /* #if !UCONFIG_NO_FORMATTING */
index 8e0a29fadcac8ba95ec8cf10a748dbb7e0c47c8d..893aad655886d594b9302de856fc33b5efa01f8a 100644 (file)
@@ -103,6 +103,8 @@ public:
 
     void TestGetWindowsID(void);
     void TestGetIDForWindowsID(void);
+    void TestCasablancaNameAndOffset22041(void);
+    void TestRawOffsetAndOffsetConsistency22041(void);
 
     static const UDate INTERVAL;
 
index 48cf764f29933d718196f2887efce7da8a1ad28d..a69f7cea5e5ae245f9bf2d8463450ffb42180568 100644 (file)
@@ -2323,6 +2323,36 @@ public class TimeZoneTest extends TestFmwk
         assertFalse("Compare TimeZoneAdapter with TimeZone", icuChicagoWrapped.equals(icuChicago));
         assertTrue("Compare two TimeZoneAdapters", icuChicagoWrapped.equals(icuChicagoWrapped2));
     }
+
+    @Test
+    public void TestCasablancaNameAndOffset22041() {
+        String id = "Africa/Casablanca";
+        TimeZone zone = TimeZone.getTimeZone(id);
+        String standardName = zone.getDisplayName(false, TimeZone.LONG, Locale.ENGLISH);
+        String summerName = zone.getDisplayName(true, TimeZone.LONG, Locale.ENGLISH);
+        assertEquals("TimeZone name for Africa/Casablanca should not contain '+02' since it is located in UTC, but got "
+                     + standardName, -1, standardName.indexOf("+02"));
+        assertEquals("TimeZone name for Africa/Casablanca should not contain '+02' since it is located in UTC, but got "
+                     + summerName, -1, summerName.indexOf("+02"));
+        int[] offsets = new int[2]; // raw = offsets[0], dst = offsets[1]
+        zone.getOffset((new Date()).getTime(), false, offsets);
+        int raw = offsets[0];
+        assertEquals("getRawOffset() and the raw from getOffset(now, false, offset) should not be different but got",
+                     zone.getRawOffset(), raw);
+    }
+
+    @Test
+    public void TestRawOffsetAndOffsetConsistency22041() {
+        long now = (new Date()).getTime();
+        int[] offsets = new int[2]; // raw = offsets[0], dst = offsets[1]
+        for (String id : TimeZone.getAvailableIDs()) {
+            TimeZone zone = TimeZone.getTimeZone(id);
+            zone.getOffset((new Date()).getTime(), false, offsets);
+            int raw = offsets[0];
+            assertEquals("getRawOffset() and the raw from getOffset(now, false, offset) should not be different but got",
+                         zone.getRawOffset(), raw);
+        }
+    }
 }
 
 //eof