2013-04-05 36 views
8

Tôi chạy một chương trình Java trên máy Windows. Tôi đang cố gắng để có được một danh sách các múi giờ và thông tin liên quan của họ. Dưới đây là chương trình hoàn chỉnh:Java không tạo ra thông tin múi giờ chính xác

String[] allTimeZones = TimeZone.getAvailableIDs(); 
    Date now = new Date(); 
    for (int i = 0; i < allTimeZones.length; i++) { 
     TimeZone tz = TimeZone.getTimeZone(allTimeZones[i]); 
     System.out.format("%s;%s; %f \n", 
          allTimeZones[i], 
          tz.getDisplayName(), 
          (float) (tz.getOffset(now.getTime())/3600000.0)); 
    } 

Một trong những múi giờ được tạo ra có các thông tin sau:

America/New_York; Giờ chuẩn Đông; -4.000000

Điều này thật khó hiểu. Tại thời điểm này, New York đang ở thời gian tiết kiệm ánh sáng ban ngày mùa hè đông. Vì vậy, thông tin trên không đúng.

Có ai biết làm thế nào tôi có thể làm cho Java để tạo

America/New_York; Giờ chuẩn Đông; -5,000000

hoặc một cái gì đó giống như

America/New_York này; Đông Summer Daylight Saving Time; -4.000000

Cảm ơn bạn đã trợ giúp!

Trân

+1

http://www.timeanddate.com/worldclock/city.html?n=179 –

+0

bạn có yêu cầu cho làm thế nào để có được tất cả các múi giờ trên thế giới, hoặc làm thế nào để có được "thời gian cục bộ" như được định nghĩa trên hệ điều hành của máy tính mà mã của bạn đang chạy? –

+1

Ngoài ra, hãy xem [JodaTime] (http://joda-time.sourceforge.net/) được xem là thư viện ngày/giờ tốt hơn. –

Trả lời

2

Sử dụng getDisplayName(daylight, style), đi qua trong true cho daylight. Đây sẽ in:

America/New_York;Eastern Daylight Time; -4.000000 

Nhưng bạn sẽ phải xác định xem thời gian hiện tại là trong thời gian tiết kiệm ánh sáng ban ngày hay không (hoặc nó sẽ luôn luôn trở về "Daylight Time", ngay cả trong mùa thu và mùa đông). Điều này sẽ làm các trick:

String[] allTimeZones = TimeZone.getAvailableIDs(); 
Date now = new Date(); 
for (int i = 0; i < allTimeZones.length; i++) { 
    TimeZone tz = TimeZone.getTimeZone(allTimeZones[i]); 
    System.out.format("%s;%s; %f \n", allTimeZones[i], 
      tz.getDisplayName(tz.inDaylightTime(now), TimeZone.LONG), 
      (float) (tz.getOffset(now.getTime())/3600000.0)); 
} 
+0

Cảm ơn bạn. Bạn là người hùng của tôi! Tôi đã thử nghiệm nó. Chỉ cần chắc chắn rằng tôi hiểu nó một cách chính xác. Mã của bạn xác định chính xác và hiển thị cho dù mỗi múi giờ có nằm trong khoảng thời gian Chuẩn và Tiết kiệm ban ngày hay không, đúng không? – curious1

+0

Thực ra, nó chỉ có thể hoạt động cho múi giờ của bạn; Tôi đã không thử nghiệm rộng rãi, nhưng bạn có thể thay đổi cài đặt múi giờ trên máy tính và thử các ngày khác nhau (ví dụ: thời gian tiết kiệm ánh sáng ban ngày ở Hoa Kỳ bắt đầu trước mùa hè ở Châu Âu, vì vậy hãy kiểm tra xung quanh những ngày đó). Cũng lưu ý rằng nếu bạn muốn bù đắp mà không quan tâm đến thời gian tiết kiệm ánh sáng ban ngày, hãy sử dụng tz.getRawOffset() (không có đối số). Ví dụ, trong múi giờ phía đông, điều đó sẽ trả về -5 giờ bất kể ngày trong năm. – Jimothy

+0

Jimothy, tôi đã thử các ngày và múi giờ khác nhau, có vẻ như danh sách múi giờ và thông tin của họ là chính xác. Một lần nữa cám ơn! – curious1

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