【问题标题】:LocalDate and DateTimeFormatter do not work correctly with Japanese localeLocalDate 和 DateTimeFormatter 在日语语言环境中无法正常工作
【发布时间】:2014-10-20 05:35:29
【问题描述】:

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

我正在使用 ja_JP_JP_#u-ca-japanese 语言环境,无法使用该语言环境定义的日期模式解析日期。

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

请注意,要构造ja_JP_JP_#u-ca-japanese,您需要使用new Locale("ja", "JP", "JP"),摘自the Locale javadoc

特殊情况

出于兼容性原因,两个不符合的语言环境被视为特殊情况。它们是 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);
}

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

【问题讨论】:

    标签: java locale java-8 java-time


    【解决方案1】:

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

    在第一种情况下,您需要使用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);
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-16
      • 2012-08-27
      • 1970-01-01
      • 1970-01-01
      • 2019-01-01
      相关资源
      最近更新 更多