JDK-8042131: Proposal of Mapped-values formatter for non-IsoChronology
Toshio 5 Nakamura
TOSHIONA at jp.ibm.com
Fri Jun 15 09:10:14 UTC 2018
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
More information about the core-libs-dev
mailing list