6

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

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

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

请注意,为了构建ja_JP_JP_#u-ca-japanese,您需要按照 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(用于“日历”)并输入日语。当使用参数“ja”、“JP”、“JP”调用 Locale 构造函数时,会自动添加扩展名“u-ca-japanese”。

Java 使用 th_TH_TH 来表示泰国使用的泰语和泰语数字。这现在也可以使用 Unicode 区域设置扩展来表示,通过指定 Unicode 区域设置键 nu(用于“数字”)和值 thai。当使用参数“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);
}

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

4

1 回答 1

4

往返能力确实有效,但它需要提供所有数据。

在第一种情况下,您需要使用and方法指定语言环境年表 :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);

第二种情况也是如此,其中 usingofPattern()锁定了语言环境,但不是年表:

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

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

于 2014-10-08T22:33:28.813 回答