2017-09-15 15 views
13

Tôi đã thử một số mã trong Java 8 (1.8.0_77) và Java 9 (Java HotSpot (TM) 64-Bit Server VM (build 9 + 181, chế độ hỗn hợp))JDK dateformater phân tích DayOfWeek bằng tiếng Đức, java8 vs java9

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

tôi không quá quen thuộc với các chi tiết của những lớp học, nhưng trong Java 8 công trình này, in ấn:

mo = thứ hai

trong Java 9, tuy nhiên nó không thành công

Exception in thread "main" java.time.format.DateTimeParseException: Văn bản 'Mo' không thể phân tích tại index 0 tại java.base/java.time.format.DateTimeFormatter.parseResolved0 (DateTimeFormatter.java : 1988) tại java.base/java.time.format.DateTimeFormatter.parse (DateTimeFormatter.java:1890) tại day.main (day.java:10)

Bất kỳ ý tưởng, là này tái sản xuất?

như vậy, khi formating: sử dụng mã này:

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("eee", Locale.GERMAN); 
String format = dtf.format(DayOfWeek.MONDAY); 
System.out.println("format = " + format); 

jdk1.8.0-77:

format = Mo

jdk-9 (xây dựng 9 + 181)

forma t = Mo.

+2

https://ideone.com/6t60j1 Bạn có chắc chắn về java-8 không? –

+0

tôi cũng sử dụng 1.8.0_77. có thể sử dụng phiên bản này trên trang web này không? – user140547

+0

Ideone đang cung cấp một số phiên bản bạn không kiểm soát được. (và dịch vụ đã thực sự tốt đẹp IMHO) –

Trả lời

10

Điều này dường như có mặt ở đó trong do việc thực hiện hiện tại của CLDR date-time-patterns với việc thực hiện JEP - 252 trong đó nêu rằng

Sử dụng dữ liệu địa phương từ Common Locale liệu Repository Unicode Consortium của (CLDR) theo mặc định.

Các mẫu được bản địa hóa để định dạng và dịch hiển thị các chuỗi hiển thị, chẳng hạn như tên miền địa phương, có thể khác nhau ở một số ngôn ngữ.

Để bật hành vi tương thích với JDK 8, hãy đặt hệ thống thuộc tính java.locale.providers thành giá trị với COMPAT trước CLDR.


Và để thứ hai phần dữ liệu của nó, international components for Unicode in German locale trong đó có các thông tin liên quan sau đây có thể biện minh rằng hành vi này là cố ý -

enter image description here

Edit/Note: Được liên kết bởi @ManiGrover, migration guide nêu rõ cảnh báo tương tự cho những người thực hiện như vậy tations -

Nếu ứng dụng của bạn bắt đầu thành công, xem xét cẩn thận kiểm tra của bạn và đảm bảo rằng hành vi này là tương tự như trên JDK 8. Ví dụ, một vài người tiên phong đã nhận thấy rằng ngày và tiền tệ của họ là được định dạng khác. Xem Use CLDR Locale Data by Default.

+2

Từ https://docs.oracle.com/javase/9/migrate/toc.htm#JSMIG-GUID-AFD3BDEC-99FC-4F3C-946F-A1CD2D05B74B "Nếu ứng dụng của bạn bắt đầu thành công, hãy xem xét cẩn thận các thử nghiệm của bạn và đảm bảo rằng hành vi này giống như trên JDK 8. Ví dụ, một vài người dùng đầu tiên đã nhận thấy rằng ngày và đơn vị tiền tệ của họ được định dạng khác. Xem Sử dụng CLDR Locale Data theo Mặc định. " –

6

Chữ viết tắt "Mo", "Di" vv mà không có dấu chấm chưa biến mất trong CLDR nhưng có thể truy cập thông qua chế độ độc lập. Bạn nên thay đổi mô hình của bạn bằng cách sử dụng định dạng độc lập biểu tượng "c" thay vì "e":

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

Thật vậy, tôi xem xét việc thay đổi dữ liệu cơ bản như phá vỡ tính tương thích ngược (bê tông như phá vỡ hành vi).

+5

Việc chuyển đổi sang sử dụng dữ liệu miền địa phương CDLR theo mặc định thực sự là một thay đổi gây rối. JDK 8 bao gồm dữ liệu locale CDLR để bạn có thể chạy với '-Djava.locale.providers = CLDR' để xác định bất kỳ vấn đề nào trước khi chuyển sang JDK 9. –

Các vấn đề liên quan