【发布时间】: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