2011-10-31 33 views
6

Chúng tôi có một ứng dụng tiện ích đơn giản đọc tất cả dữ liệu múi giờ được sử dụng trong JRE và hiển thị tất cả trong một bảng đơn giản. Chúng tôi cần sử dụng phiên bản cũ hơn của JRE (6_24) cho bản phát hành sản phẩm sắp tới (do các vấn đề khác), nhưng chúng tôi cũng cần bao gồm các bản cập nhật múi giờ mới hơn trong bản phát hành đó (nếu không sẽ được bao gồm trong, ví dụ: 6_29). Chúng tôi đã đóng gói một JRE riêng sẽ được cài đặt, vì vậy việc cập nhật múi giờ vào JRE riêng tư bằng cách sử dụng TZUpdater tool không phải là vấn đề - Vấn đề đang đọc/xác minh phiên bản nào của tzdata (ví dụ: tzdata2010o, tzdata2011k) đang được đọc bằng ứng dụng tiện ích (tức là phiên bản nào đang được sử dụng trong JRE mà ứng dụng đang chạy). Ứng dụng hiện đang hiển thị phiên bản JRE JRE trong thanh tiêu đề, nhưng với bản cập nhật múi giờ, không còn đủ để xác định dữ liệu múi giờ nào đang sử dụng.Java - tìm phiên bản tzdata được sử dụng bất kể phiên bản JRE

Tôi đã xem xét lớp học TimeZone, nhưng dường như không cung cấp thông tin này - có lẽ có thuộc tính hệ thống chứa thông tin này? Công cụ TZUpdater biết phiên bản nào đang được sử dụng, vì vậy nó phải có sẵn ở đâu đó - tôi không thể tưởng tượng được họ sẽ phân tích phiên bản nào đang được sử dụng trong công cụ cập nhật ... Có ai biết vị trí của thông tin này không?

Trả lời

8

Trong một trong các tệp JRE của tôi, có một tệp trong JRE_PATH\lib\zi có tên ZoneInfoMappings. Trong dòng đầu tiên nó hiển thị dữ liệu bạn đang tìm kiếm.

Tôi sẽ tìm kiếm một cách ít hung hăng hơn, sẽ cập nhật câu trả lời nếu tôi tìm thấy điều gì đó.

CẬP NHẬT: Dường như không có API để nhận dữ liệu này. Tuy nhiên, mã trong lớp sun.util.calendar.ZoneInfoFile cho biết cách phân tích cú pháp.

+0

Yeah, đó là thư mục đó được thay thế bằng TZUpdater, và tôi đã thông báo (sau khi công bố các câu hỏi) mà ZoneInfoMappings chứa dòng đó, nhưng Notepad ++ cho thấy một số dữ liệu/ký tự khác xung quanh nó trong dòng đầu tiên khiến tôi nghĩ rằng nó sẽ yêu cầu một số công cụ hackish để có được nó ... Vì vậy, hy vọng có một cách tốt hơn để có được nó từ JRE hoặc ai đó có thể đăng mã để đọc tệp/dòng đó ... – johnny

+0

Câu trả lời được cập nhật. –

+0

mã được sử dụng ở đây làm ví dụ để phân tích cú pháp này: http://www.docjar.com/html/api/sun/util/calendar/ZoneInfoFile.java.html – johnny

1

Dưới đây là một điều hackish mà làm việc cho tôi trong cả JRE IBM và Oracle:

public static void main(String args[]) throws Exception { 
    File f = new File(System.getProperty("java.home") + File.separator + "lib" + File.separator + "zi" + File.separator + "ZoneInfoMappings"); 
    if (f.exists()) { 
     FileInputStream fis = new FileInputStream(f); 
     byte[] buf = new byte[11]; 
     try { 
      fis.skip(11); 
      fis.read(buf); 
      System.out.print("Olson Database version is "); 
      System.out.println(new String(buf)); 
     } finally { 
      fis.close(); 
     } 
    }  
} 

jdk1.6.0_29 jre tôi nói tzdata2012i, và websphere7 tôi JDK nói tzdata2011g

Bạn có thể google để những xem liệu JDK của bạn có được cập nhật hay không và các vùng nào có thay đổi gì.

1

Trong Java 8, bạn có thể sử dụng ZoneRulesProvider.getVersions("UTC"):

Ý nghĩa chính xác và định dạng của phiên bản là nhà cung cấp cụ thể. Phiên bản phải tuân theo thứ tự từ điển, do đó bản đồ được trả lại sẽ là thứ tự từ các quy tắc cũ nhất được biết đến đến các quy tắc mới nhất có sẵn. Nhóm 'TZDB' mặc định sử dụng đánh số phiên bản bao gồm năm tiếp theo là một chữ cái, chẳng hạn như '2009e' hoặc '2012f'.

Ví dụ:

System.out.println(java.time.zone.ZoneRulesProvider.getVersions("UTC").lastEntry().getKey()); 

Trong Oracle Java 8u91 của tôi, tôi nhận được:

2016a

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