LocalDate和DateTimeFormatter无法正常使用日语语言环境

时间:2014-10-02 20:21:40

标签: java locale java-8 java-time

在测试我的某些方法时,我遇到了一个奇怪的问题,我似乎已经能够获得一个具体的问题示例。

我使用的ja_JP_JP_#u-ca-japanese语言环境无法使用语言环境定义的自己的日期模式来解析日期。

我想知道我做错了什么,或者这是否是JDK错误。

请注意,为了构建ja_JP_JP_#u-ca-japanese,您需要根据the Locale javadoc的摘录使用new Locale("ja", "JP", "JP")

  

特殊情况

     

出于兼容性原因,两个不合格的语言环境被视为特殊情况。这些是ja_JP_JP和th_TH_TH。这些在BCP 47中是不正确的,因为变体太短。为了便于迁移到BCP 47,这些都在施工期间得到了特殊处理。这两种情况(只有这些)导致构造函数生成扩展,所有其他值的行为与Java 7之前完全相同。

     

Java使用ja_JP_JP代表日本使用日语和日本帝国日历。现在可以使用Unicode语言环境扩展来表示,通过指定Unicode语言环境键ca(对于" calendar")并键入japanese。当使用参数" ja"," JP"," JP"调用Locale构造函数时,扩展名" u-ca-japanese"自动添加。

     

Java使用th_TH_TH来表示泰国使用的泰语以及泰国数字。现在,通过指定Unicode语言环境键nu(对于"数字")和值泰语,现在也可以使用Unicode语言环境扩展来表示。当使用参数" th"," TH"," TH"调用Locale构造函数时,扩展名" u-nu-thai"自动添加。

演示此问题的给定测试用例:

@Test
public void testJapaneseLocale() {
    LocalDate specificLocalDate = LocalDate.of(2014, 10, 2);
    Locale jpLocale = new Locale("ja", "JP", "JP");

    DateTimeFormatter jpDateTimeFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT).withLocale(jpLocale);
    String jpDate = specificLocalDate.format(jpDateTimeFormatter);

    String jpPattern = DateTimeFormatterBuilder.getLocalizedDateTimePattern(FormatStyle.SHORT, null, Chronology.ofLocale(jpLocale), jpLocale);
    LocalDate jpLocalDate = LocalDate.parse(jpDate, DateTimeFormatter.ofPattern(jpPattern, jpLocale));

    assertEquals(specificLocalDate, jpLocalDate);
}

此代码适用于任何其他常规语言环境,例如英语等。

1 个答案:

答案 0 :(得分:4)

圆形跳闸功能确实有效,但它需要提供所有数据。

在第一种情况下,您需要使用withLocale()withChronology()方法指定区域设置年表:

LocalDate date = LocalDate.of(2014, 10, 2);
Locale jpLocale = new Locale("ja", "JP", "JP");
Chronology chrono = Chronology.ofLocale(jpLocale);
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT)
        .withLocale(jpLocale)
        .withChronology(chrono);
String jpDateStr = date.format(f);
LocalDate result = LocalDate.parse(jpDateStr, f);

第二种情况也是如此,其中使用ofPattern()锁定语言环境,而不是年代表:

String pattern = DateTimeFormatterBuilder.getLocalizedDateTimePattern(
    FormatStyle.SHORT, null, chrono, jpLocale);
DateTimeFormatter f = DateTimeFormatter.ofPattern(pattern, jpLocale)
    .withChronology(chrono);
LocalDate jpLocalDate = LocalDate.parse(jpDateStr, f);

只有当区域设置和年表都可用并且使用时才可以进行往返。您的问题基于尝试使用日语语言环境进行格式化,但不一致地应用日语年表。