JDK dateformatter解析德语语言环境中的DayOfWeek,java8 vs java9

时间:2017-09-15 17:21:12

标签: java java-8 java-time java-9

我在Java 8(1.8.0_77)和Java 9(Java HotSpot(TM)64位服务器VM(构建9 + 181,混合模式))中尝试了一些代码。

import { BrowserModule } from '@angular/platform-browser';
import { NgForOf  } from '@angular/common';
import { NgModule } from '@angular/core';
import { FormsModule }   from '@angular/forms';
import { NgModel } from '@angular/forms';

import { ChatComponent } from 'src/app.chatComponent';
import { MsgComponent } from 'src/app.msgComponent';

@NgModule({
  imports: [
    BrowserModule,
    FormsModule 
  ],
  declarations: [
    ChatComponent,
    MsgComponent
  ],
  providers: [],
  bootstrap: [ChatComponent]
})
export class AppModule { }

我对这些类的细节并不太熟悉,但在Java 8中这是有效的,打印:

  

mo =星期一

在Java 9中,它失败了

  

线程“main”中的异常java.time.format.DateTimeParseException:无法在索引0处解析文本“Mo”       at java.base / java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1988)       在java.base / java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1890)       at day.main(day.java:10)

任何想法,这都是可以重现的吗?

所以,在形成时: 使用此代码:

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("eee", Locale.GERMAN);
DayOfWeek mo = dtf.parse("Mo", DayOfWeek::from);
System.out.println("mo = " + mo);

jdk1.8.0-77:

  

format = Mo

jdk-9(build 9 + 181)

  

format = Mo。

2 个答案:

答案 0 :(得分:12)

由于当前的实施与CLDR date-time-patterns的实施有明确规定

,因此JEP - 252似乎存在这种情况
  

使用Unicode Consortium的公共区域设置数据中的区域设置数据   存储库(CLDR)默认情况下。

     

用于格式化和翻译显示的本地化模式   字符串(例如区域设置名称)在某些区域设置中可能不同。

     

要启用与JDK 8兼容的行为,请设置系统   将属性java.locale.providers添加到CLDR 之前 COMPAT的值。

为了使数据部分成为第二部分,具有以下相关信息的international components for Unicode in German locale可以证明行为是故意的 -

enter image description here

编辑/注意 :由@ManiGrover链接,migration guide对此类实施发出类似警告 -

  

如果您的应用程序成功启动,请仔细查看您的测试   并确保行为与JDK 8上的行为相同。例如,a   很少有早期采用者注意到他们的日期和货币   格式不同。见Use CLDR Locale Data by Default.

答案 1 :(得分:7)

没有点的缩写“Mo”,“Di”等在CLDR中没有消失,但可以通过独立模式访问。 您应该使用独立格式符号“c”而不是“e”更改您的模式:

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("ccc", Locale.GERMAN);
DayOfWeek mo = dtf.parse("Mo", DayOfWeek::from);

实际上,我认为基础数据的变化是破坏向后兼容性(具体如行为中断)。