2014-05-19 21 views
8

Tôi cần nhận tên tháng theo số của nó trong số Locales khác nhau.Lấy tên tháng đề cử trong jodaTime

Để thực hiện điều này, tôi tạo ra một DateTime (hoặc YearMonth, không quan trọng) Object và nhận monthOfYear tài sản của nó:

YearMonth md = new YearMonth(1992, month); 
System.out.println(md.monthOfYear().getAsText(new Locale("ru"))); 

Cái này là hoạt động tốt cho ngôn ngữ tiếng Anh, bởi vì tên được bổ nhiệm và sở hữu cách là tương tự, nhưng đối với các ngôn ngữ khác, nó chỉ trả về Genitive, đó không phải là những gì tôi cần.

Làm cách nào để nhận được tên tháng đề cử?

Trả lời

3

Có một ý nghĩa (! Ngược không tương thích) sự thay đổi trong cách các tên tháng được khoanh vùng trong Java 7 và Java 8.

này liên quan đến java.time API mới (Tutorial) được giới thiệu bởi Java 8. API (khá hợp lý) phân biệt hai hình thức khác nhau của một tên tháng, theo quy định của java.time.format.TextStyleenum:

  • độc, đại diện cho mo tên thứ n. Nó tương ứng với "đề cử" trong nhiều ngôn ngữ.
  • Chuẩn, thường được sử dụng bên trong các biểu diễn ngày đầy đủ. Điều này tương ứng với "genitive".

Biến thể mặc định cho trình định dạng ngày là "chuẩn", điều này cũng có vẻ hợp lý, vì trình định dạng thường được sử dụng để tạo ngày hoàn chỉnh. Thật không may, điều này dẫn đến một sự thay đổi trong hành vi (ít nhất là đối với một số ngôn ngữ) giữa Java 7 (được sử dụng để tạo ra các tên độc lập) và Java 8 (tạo ra một tên "chuẩn").

Có thể yêu cầu một cách rõ ràng biểu mẫu độc lập/đề cử bằng cách sử dụng liệt kê TextStyle nêu trên. Thật không may, điều này làm cho mã của bạn phụ thuộc vào Java 8 hoặc cao hơn.

bản demo nhanh:

import java.time.Month; 
import java.time.format.TextStyle; 
import java.util.Locale; 

for (TextStyle ts : TextStyle.values()) { 
    System.out.print(ts + ": "); 
    System.out.print(Month.OCTOBER.getDisplayName(ts, Locale.ENGLISH) + "/"); // English 
    System.out.print(Month.OCTOBER.getDisplayName(ts, Locale.forLanguageTag("cs")) + "/"); // Czech 
    System.out.print(Month.OCTOBER.getDisplayName(ts, Locale.forLanguageTag("ru")) + "/"); // Russian 
    System.out.println(Month.OCTOBER.getDisplayName(ts, Locale.forLanguageTag("pl"))); // Polish 
} 

nào in:

FULL: October/října/октября/października 
FULL_STANDALONE: 10/říjen/Октябрь/październik 
SHORT: Oct/Říj/окт/paź 
SHORT_STANDALONE: 10/X/Окт./paź 
NARROW: O/ř/О/p 
NARROW_STANDALONE: 10/ř/О/p 

Tôi không biết về bất kỳ cách dễ dàng để có được những hình thức độc lập sẽ được làm việc theo cả hai Java 7 và Java 8. Tại ít nhất là không phải trong Java thuần túy - tất nhiên, có một số cách phức tạp và dễ vỡ hơn, như cố gắng phát hiện phiên bản Java hoặc sử dụng một số thư viện của bên thứ ba.

+1

Phần lớn chức năng java.time được chuyển về Java 6 & 7 trong [* ThreeTen-Backport *] (http://www.threeten.org/threetenbp/). Điều chỉnh thêm cho Android trong dự án [* ThreeTenABP *] (https://github.com/JakeWharton/ThreeTenABP). –

6

Tôi nghĩ bạn đang bối rối về tính nguyên thủy với đề cử. Khi tôi chạy đoạn mã sau:

import org.joda.time.YearMonth; 
import java.util.Locale; 

public class X { 

    public static void main(String[] s){ 
     for (int i = 1;i<13; i++) { 
      YearMonth md = new YearMonth(1992, i); 
      System.out.println(md.monthOfYear().getAsText(new Locale("ru"))); 
     } 
    } 
} 

tôi nhận được kết quả sau:

Январь 
Февраль 
Март 
Апрель 
Май 
Июнь 
Июль 
Август 
Сентябрь 
Октябрь 
Ноябрь 
Декабрь 

Đó là, đối với kiến ​​thức Nga của tôi :) được bổ nhiệm. Bạn có thể cần phải có được tính nguyên thủy, nhưng tôi nghi ngờ Joda hỗ trợ nó. Bạn đang miễn phí để thực hiện nó cho mình, vui lòng xem câu hỏi này: Month name in genitive (Polish locale) with Joda-Time DateTimeFormatter

+1

tôi copy-dán và chạy mã của bạn và tôi nhận được kết quả SỞ HỮU CÁCH: января февраля марта апреля ... :) phiên bản của jodatime là gì? Tôi là 2.3 – troy

+0

Chà, điều đó thật thú vị ... Tôi sử dụng 2,4 nhưng không thể tái tạo điều này bằng cách chuyển đổi phiên bản Joda. Có lẽ nó có sth để làm với: https://bugs.openjdk.java.net/browse/JDK-8054482 –

+0

Tôi tin rằng điều này phụ thuộc vào phiên bản Java. Java làm gì cả hai bạn đều có? – Marwin

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