Hello core-libs and i18n folks,
We'd like to request to reconsider JDK-8042131, "DateTimeFormatterBuilder Mapped-values do not work for JapaneseDate". The report was posted by our team long time ago, and was closed as not an issue. At that time, the feature was for only IsoChronology. Now, I found the attached patch can activate the mapped-values formatter for non-IsoChronology. Additionally, the Japanese new era will be expected in May 2019. The first year of each era has a special expression in Japanese, "U+5143 U+5e74" (Gannen). java.util.JapaneseImperialCalendar uses this expression. We'd like to use the expression with JapaneseChronology by mapped-values formatter as an option. Can we have a sponsor of this proposal? --sample usage of Japanese new era-- DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder(); Map<Long, String> yearMap = new HashMap<>(); yearMap.put(1L, "\u5143"); builder.appendText(ChronoField.ERA, TextStyle.FULL) .appendText(ChronoField.YEAR_OF_ERA, yearMap) .appendLiteral("\u5e74"); --------------- Report: https://bugs.openjdk.java.net/browse/JDK-8042131 Patch: --- old/src/java.base/share/classes/java/time/format/DateTimeFormatterBuilder.java 2018-06-15 17:39:11.489303979 +0900 +++ new/src/java.base/share/classes/java/time/format/DateTimeFormatterBuilder.java 2018-06-15 17:39:11.157303972 +0900 @@ -793,6 +793,11 @@ final LocaleStore store = new LocaleStore(map); DateTimeTextProvider provider = new DateTimeTextProvider() { @Override + public String getText(Chronology chrono, TemporalField field, + long value, TextStyle style, Locale locale) { + return store.getText(value, style); + } + @Override public String getText(TemporalField field, long value, TextStyle style, Locale locale) { return store.getText(value, style); } --- old/test/jdk/java/time/test/java/time/format/TestDateTimeFormatterBuilderWithLocale.java 2018-06-15 17:39:12.664304007 +0900 +++ new/test/jdk/java/time/test/java/time/format/TestDateTimeFormatterBuilderWithLocale.java 2018-06-15 17:39:12.298303999 +0900 @@ -67,14 +67,21 @@ import java.time.chrono.Chronology; import java.time.chrono.IsoChronology; import java.time.chrono.JapaneseChronology; +import java.time.chrono.JapaneseEra; import java.time.chrono.MinguoChronology; +import java.time.chrono.ThaiBuddhistChronology; +import java.time.chrono.ChronoLocalDate; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatterBuilder; import java.time.format.FormatStyle; import java.time.LocalDate; import java.time.temporal.Temporal; +import java.time.temporal.ChronoField; +import static java.time.temporal.ChronoUnit.YEARS; import java.util.Locale; +import java.util.Map; +import java.util.HashMap; import static org.testng.Assert.assertEquals; @@ -115,6 +122,31 @@ } //----------------------------------------------------------------------- + @DataProvider(name="mappedPatterns") + Object[][] localizedMappedPatterns() { + return new Object[][] { + {IsoChronology.INSTANCE.date(1,1,1), Locale.ENGLISH}, + {JapaneseChronology.INSTANCE.date(JapaneseEra.HEISEI, + 1,1,8), Locale.ENGLISH}, + {MinguoChronology.INSTANCE.date(1,1,1), Locale.ENGLISH}, + {ThaiBuddhistChronology.INSTANCE.date(1,1,1), Locale.ENGLISH}, + }; + } + + @Test(dataProvider="mappedPatterns") + public void test_getLocalizedMappedPattern(ChronoLocalDate date, Locale locale) { + final String new1st = "1st"; + Map<Long, String> yearMap = new HashMap<>(); + yearMap.put(1L, new1st); + DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder(); + builder.appendText(ChronoField.YEAR_OF_ERA, yearMap); + + String actual = date.format(builder.toFormatter(locale)); + assertEquals(actual, new1st); + } + + + //----------------------------------------------------------------------- @DataProvider(name="localePatterns") Object[][] localizedDateTimePatterns() { return new Object[][] { --- Best regards, Toshio Nakamura, IBM Japan