2008-10-21 18 views
5

Xây dựng một ứng dụng java hỗ trợ Locales khác nhau, nhưng muốn tùy chỉnh hiển thị DateFormat ngoài những gì có sẵn giữa các tùy chọn FULL, LONG, MEDIUM và SHORT DateFormat. Có thể làm những việc như đặt một ký tự giữa các thành phần ngày tháng và thời gian của một DateFormat.getDateTimeFormat(), viết thường là AM/PM, vv, ít nhất là cho tiếng Anh.Tùy chỉnh các định dạng java.text cho các Locales khác nhau

thể nghĩ ra 3 cách để làm điều đó:

1) nếu miền địa phương là tiếng Anh, sử dụng chuỗi định dạng tùy chỉnh của tôi trên một đối tượng SimpleDateFormat mới.

2) sửa đổi các chuỗi định dạng mặc định cho miền địa phương hiện có

3) tạo ra một biến miền địa phương mới chỉ định chuỗi định dạng Tôi muốn

Không thể tìm ra cách để làm 2 hoặc 3 (hoặc nếu nó thậm chí có thể), và không muốn làm 1 ... có ai xử lý bất cứ điều gì như thế này trước đây không?

cũng có vẻ như 2 hoặc 3 là cần thiết để giảm AM/PM? (Chỉ định nguồn tài nguyên AmPmMarkers cho cài đặt định dạng ngày tháng của địa phương)

Trả lời

0

Điều duy nhất tương tự với thực tế là "strftime" và "locale" nói rằng Ý nên sử dụng dấu hai chấm giữa các trường thời gian, nhưng Java đặt đầy đủ -kết nối giữa chúng. Vì vậy, tôi đã thêm mã sau đây:

// This is an incredibly ugly hack, but it's based on the fact that 
    // Java for some reason decided that Italy uses "." between 
    // hours.minutes.seconds, even though "locale" and strftime say 
    // something different. 
     hmsTimeFormat = DateFormat.getTimeInstance(DateFormat.MEDIUM); 
     if (hmsTimeFormat instanceof SimpleDateFormat) 
     { 
     String str = ((SimpleDateFormat)hmsTimeFormat).toPattern(); 
     str = str.replace('.', ':'); 
     hmsTimeFormat = new SimpleDateFormat(str); 
     } 
1

Tại sao không sử dụng MessageFormat?

Sử dụng mẫu "{0, date, short} văn bản của bạn tại đây {0, time, short}" để thực hiện những gì bạn muốn.

+2

bởi vì đôi khi nó cần được "{0, thời gian, ngắn} văn bản của bạn ở đây {0, ngày, ngắn}", tùy thuộc vào miền địa phương. –

0

cách thỏa mãn nhất để giải quyết việc này mà chúng tôi đã tìm ra là để tải Strings giờ sáng, chiều, formatString từ một bó tài nguyên bản địa đặc thù, và sau đó:

SimpleDateFormat sdf = (SimpleDateFormat)sdf.getDateTimeInstance(DateTime.SHORT,DateTime.SHORT, locale); 
if (formatString != null) { 
    sdf = new SimpleDateFormat(formatString); 
} 
if (am!= null && pm != null) { 
    DateFormatSymbols symbols = sdf.getDateFormatSymbols(); 
    symbols.setAmPmStrings(new String[]{am, pm}); 
    sdf.setDateFormatSymbols(symbols); 
} 

Paul: không chắc chắn có một tách trong DateFormatSymbols, mặc dù ... vì vậy bạn có thể cần phải giữ str.replace

0

Tôi khuyên bạn nên sử dụng Joda Time để định dạng ngày của bạn. Nó có tính linh hoạt mạnh mẽ nhưng thanh lịch trong định dạng của nó. Có thể bạn sẽ thấy rằng các trình định dạng của nó tạo ra những gì bạn muốn làm cực kỳ đơn giản.

BTW: một khi bạn đi Joda, bạn sẽ không bao giờ quay trở lại!

1

Java có Lớp chỉ dành cho trường hợp này, là lớp ResourceBundle. Back nó với một tập tin thuộc tính và bạn có tất cả những gì bạn cần cộng thêm.

Thậm chí không có lớp ResourceBundle, bạn có thể sử dụng các tệp properties để giữ tất cả các định dạng SimpleDateFormat.

Settings formats = new Settings(); 
Properties SDFFormats = formats.load(propertiesFile); 

String SDFAmerica = SDFFormats.getProperty("FormatAmerica"); 

Trong khi nhập cảnh vào tập tin thuộc tính có thể đọc

FormatAmerica = MMM-dd-yyyy 
Các vấn đề liên quan