2015-09-29 25 views
6

Tôi cần phải định dạng ngày không đầy đủ chỉ cho độ chính xác tháng. Đoán đầu tiên của tôi là áp dụng mẫu "MMMM yyyy" cho nó. Điều này phù hợp với nhiều ngôn ngữ (tiếng Anh, tiếng Đức, ...), nhưng cho kết quả xấu xí đối với các ngôn ngữ có độ uốn, ví dụ: Tiếng Nga. Tôi đọc documentation of SimpleDateFormat và thấy rằng 'L' được cho là cung cấp tên tháng không phân biệt ngữ cảnh: chỉ là những gì tôi cần, vì không có ngày trong tháng trong mẫu. Vì vậy, tôi đã thử mẫu "LLLL yyyy" thay thế. Nó hoạt động hoàn hảo cho tiếng Nga và các ngôn ngữ flexion khác, nhưng thay vào đó không thành công, ví dụ: Tiếng Anh và tiếng Đức ...Dạng riêng của tên tháng theo định dạng ngày Java

Đây là mã kiểm tra:

import java.text.*; 
import java.util.*; 

public class test 
{ 
    public static void main (String[] arguments) throws Exception 
    { 
     for (String locale : new String[] { "en", "de", "hu", "it", "ru", "fi", "pl" }) 
      System.out.format ("%s: %s \t%s\n", locale, 
           new SimpleDateFormat ("MMMM yyyy", new Locale (locale)).format (new Date()), 
           new SimpleDateFormat ("LLLL yyyy", new Locale (locale)).format (new Date())); 
    } 
} 

Và sản lượng của nó:

en: September 2015  0009 2015 
de: September 2015  0009 2015 
hu: szeptember 2015  szeptember 2015 
it: settembre 2015  Settembre 2015 
ru: сентября 2015  Сентябрь 2015 
fi: syyskuuta 2015  syyskuu 2015 
pl: września 2015  wrzesień 2015 

Vì vậy, đối với những miền địa phương kiểm tra: 'en' và 'de' hoạt động đúng chỉ với 'M', 'hu' là tốt với cả 'M' và 'L', 'nó' có lẽ tốt hơn với 'L' (không biết chữ cái quan trọng như thế nào ở đây), trong khi 'ru', 'fi' và 'pl' cho đầu ra chính xác chỉ với 'L' (điều này tôi thực sự có thể nói chỉ cho Nga và Ba Lan, nhưng tôi đoán nó tương tự như ở Phần Lan).

Câu hỏi:

  • Tôi có thể làm gì đó để làm cho SimpleDateFormat hoặc một định dạng ngày tháng tương tự như lớp điều trị 'L' đúng cho tất cả các miền địa phương?

  • Ngoài ra, có cách nào đơn giản để biết liệu 'M' hoặc 'L' có nên được sử dụng cho bất kỳ ngôn ngữ cụ thể nào không?

+0

Tôi không nói tiếng Nga nhưng bạn có nói rằng từ định danh 'M' đưa ra tên tháng không chính xác? Sự khác biệt về ý nghĩa giữa 'сентября' và 'Сентябрь' là gì? – Tunaki

+1

Tương tự như tiếng Phần Lan. Tên của tháng là syyskuu. Nhưng nếu có một ngày đề cập đến nó phải là: 15. syyskuuta (đó là ý nghĩa của hình thức độc lập so với bối cảnh nhạy cảm). –

+1

Bạn đang sử dụng phiên bản Java 8 nào? 'L' chỉ được giới thiệu trong Java 8, và trên máy của tôi, chương trình của bạn cũng tạo ra" Tháng Chín "cho' en' và 'de'. Có lẽ bạn có một phiên bản với các tệp miền địa phương đã lỗi thời? – RealSkeptic

Trả lời

3

Đây là một lỗi chính thức - JDK-8075548

Lỗi đang trong tình trạng "giải quyết", và bạn có thể thấy rằng việc sửa chữa đã được backported với các phiên bản 8_60 và 8_65, nhưng phiên bản không trước của Java 8

Do đó, giải pháp thích hợp, nếu có thể, là nâng cấp lên Java 1.8.0_60.

+0

Có, hoạt động với bản nâng cấp 60 như mong đợi. Cảm ơn bạn. – doublep

0

java.time

Lớp SimpleDateFormat là một phần của các lớp học ngày thời gian cũ phiền hà mà bây giờ là di sản, thay thế bằng các lớp java.time.

Trong java.time, mã mẫu định dạng giống với mã mẫu cũ nhưng tiếp theo giống hệt nhau. Đảm bảo nghiên cứu tài liệu lớp học cho DateTimeFormatter.

final DateTimeFormatter fCombo = DateTimeFormatter.ofPattern ("MMMM uuuu"); 
final DateTimeFormatter fStandalone = DateTimeFormatter.ofPattern ("LLLL uuuu"); 

final LocalDate localDate = LocalDate.now (ZoneId.of ("America/Montreal")); 
for (final String locale : new String[] { "en" , "fr" , "de" , "hu" , "it" , "ru" , "fi" , "pl" }) { 
    final Locale l = new Locale (locale); 

    System.out.format (
      "%s: %s | %s\n", 
      locale, 
      localDate.format (fCombo.withLocale (l)), 
      localDate.format (fStandalone.withLocale (l)) 
    ); 
} 
en

: Tháng 3 năm 2017 | 3 2017

fr: mars 2017 | 3 2017

nhưng

: März 2017 | 3 2017

en: tháng 3 năm 2017 | Tháng 3 năm 2017

nó: Marzo 2017 | Marzo 2017

ru: марта 2017 | Март 2017

fi: maaliskuuta 2017 | maaliskuu 2017

ví dụ Marca 2017 | Marzec 2017


Về java.time java.time Khung được xây dựng vào Java 8 và sau đó. Những lớp học thay thế các rắc rối legacy lớp ngày thời gian cũ java.util.Date Chẳng hạn như, Calendar, & SimpleDateFormat.

Joda-Time Dự án, bây giờ trong maintenance mode, java.time khuyên chuyển đổi sang các lớp học.

Để tìm hiểu thêm, xem Oracle Tutorial. Stack Overflow và tìm kiếm các ví dụ và giải thích nhiều. Đặc điểm kỹ thuật là JSR 310.

ở đâu để có được các lớp java.time?

  • Java SE 8SE 9 và sau
    • Built-in.
    • Một phần của Java API chuẩn bằng Việc Triển Khai kèm.
    • Java 9 cho biết thêm một số tính năng nhỏ và sửa lỗi.
  • Java SE 6SE 7
    • nhiều chức năng java.time cũng back-chuyển đến Java 6 7 & trong ThreeTen-Backport.
  • Android

ThreeTen-Extra Dự án mở rộng java.time với các lớp bổ sung.Dự án này là một nền tảng chứng minh cho những bổ sung có thể có trong tương lai vào java.time. Bạn có thể tìm thấy một số lớp học hữu ích tại đây như Interval, YearWeek, YearQuartermore.

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