ski*_*iwi 6 java locale java-8 java-time
在测试我的一些方法时,我遇到了一个奇怪的问题,我似乎已经能够获得我的问题的具体例子.
我使用的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(对于"calendar")并键入japanese.当使用参数"ja","JP","JP"调用Locale构造函数时,会自动添加扩展名"u-ca-japanese".
Java使用th_TH_TH来表示泰国使用的泰语以及泰国数字.现在,使用Unicode语言环境扩展,通过指定Unicode语言环境键nu(用于"数字")和值泰语,也可以表示这一点.当使用参数"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);
}
Run Code Online (Sandbox Code Playgroud)
此代码适用于任何其他常规语言环境,例如英语等.
往返能力确实有效,但它需要所有数据都可用。
在第一种情况下,您需要使用和方法指定区域设置和时间顺序 :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);
Run Code Online (Sandbox Code Playgroud)
第二种情况也是如此,其中 usingofPattern()锁定语言环境,但不锁定时间顺序:
String pattern = DateTimeFormatterBuilder.getLocalizedDateTimePattern(
FormatStyle.SHORT, null, chrono, jpLocale);
DateTimeFormatter f = DateTimeFormatter.ofPattern(pattern, jpLocale)
.withChronology(chrono);
LocalDate jpLocalDate = LocalDate.parse(jpDateStr, f);
Run Code Online (Sandbox Code Playgroud)
只有当区域设置和时间顺序都可用并使用时,才可以进行往返。您的问题是基于尝试使用日语区域设置进行格式化,但应用日语时间顺序不一致。
| 归档时间: |
|
| 查看次数: |
1146 次 |
| 最近记录: |