]> granicus.if.org Git - icu/commitdiff
ICU-13215 DayPeriodRules.getInstance should ignore keywords to get correct data and...
authorPeter Edberg <pedberg@unicode.org>
Fri, 23 Jun 2017 05:02:12 +0000 (05:02 +0000)
committerPeter Edberg <pedberg@unicode.org>
Fri, 23 Jun 2017 05:02:12 +0000 (05:02 +0000)
X-SVN-Rev: 40196

icu4c/source/i18n/dayperiodrules.cpp
icu4c/source/test/intltest/dtfmttst.cpp
icu4j/main/classes/core/src/com/ibm/icu/impl/DayPeriodRules.java
icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/DateFormatTest.java

index f7ec1e6dc2dded407e6ee64148ea0514a29f9e8e..e364ecb708cf663f4c0c4914fa1642f5ecc94227 100644 (file)
@@ -340,7 +340,7 @@ const DayPeriodRules *DayPeriodRules::getInstance(const Locale &locale, UErrorCo
     // does), return NULL.
     if(U_FAILURE(errorCode)) { return NULL; }
 
-    const char *localeCode = locale.getName();
+    const char *localeCode = locale.getBaseName();
     char name[ULOC_FULLNAME_CAPACITY];
     char parentName[ULOC_FULLNAME_CAPACITY];
 
index ba0929f2ddf2c0a3253a20d213b4c15d4d7089fa..a782bdfaa2fff9c8a9627acb13ab4ff40d74f241 100644 (file)
@@ -5251,6 +5251,15 @@ void DateFormatTest::TestDayPeriodWithLocales() {
     sdf.applyPattern(UnicodeString("hh:mm:ss BBBB"));
     assertEquals("hh:mm:ss BBBB | 01:00:00 | es", "01:00:00 de la madrugada",
         sdf.format(k010000, out.remove()));
+
+    // #13215: for locales with keywords, check hang in DayPeriodRules""getInstance(const Locale, ...),
+    // which is called in SimpleDateFormat::format for patterns that include 'B'.
+    sdf = SimpleDateFormat(UnicodeString(), Locale("en@calendar=buddhist"), errorCode);
+    sdf.setTimeZone(*tz);
+
+    sdf.applyPattern(UnicodeString("hh:mm:ss BBBB"));
+    assertEquals("hh:mm:ss BBBB | 01:00:00 | en@calendar=buddhist", "01:00:00 at night",
+        sdf.format(k010000, out.remove()));
 }
 
 void DateFormatTest::TestMinuteSecondFieldsInOddPlaces() {
index dc60c6059bd4952a63b53c6ec3913dc225b3da60..8eec59256dd89495c3fd7130f67380b46fb786e2 100644 (file)
@@ -242,7 +242,7 @@ public final class DayPeriodRules {
      * @return a DayPeriodRules object for `locale`.
      */
     public static DayPeriodRules getInstance(ULocale locale) {
-        String localeCode = locale.getName();
+        String localeCode = locale.getBaseName();
         if (localeCode.isEmpty()) { localeCode = "root"; }
 
         Integer ruleSetNum = null;
index 63a55504cae7311c8f6afcc226160e9dfd52f2a0..c3de66d88d714e6c72bb62e84569da1449b8dd68 100644 (file)
@@ -5195,6 +5195,14 @@ public class DateFormatTest extends com.ibm.icu.dev.test.TestFmwk {
 
         sdf.applyPattern("hh:mm:ss BBBB");
         assertEquals("hh:mm:ss BBBB | 01:00:00 | es", "01:00:00 de la madrugada", sdf.format(k010000));
+
+        // #13215: for locales with keywords, check hang in DayPeriodRules.getInstance(ULocale),
+        // which is called in SimpleDateFormat.format for patterns that include 'B'.
+        sdf = new SimpleDateFormat("", new ULocale("en@calendar=buddhist"));
+        sdf.setTimeZone(TimeZone.GMT_ZONE);
+
+        sdf.applyPattern("hh:mm:ss BBBB");
+        assertEquals("hh:mm:ss BBBB | 01:00:00 | en@calendar=buddhist", "01:00:00 at night", sdf.format(k010000));
     }
 
     @Test