2013-04-05 3 views
8

Я запускаю программу Java на компьютере под управлением Windows. Я пытаюсь получить список часовых поясов и их соответствующую информацию. Вот полная программа:Java не дает правильную информацию о часовом поясе

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)); 
    } 

Один из сгенерированной временной зоны имеет следующую информацию:

Америка/Триатлон, по восточному поясному времени; -4.000000

Это озадачивает. В этот момент Нью-Йорк находится в летнем летнем летнем времени. Поэтому приведенная выше информация неверна.

Кто-нибудь знает, как я могу сделать Java для создания

America/New_York; восточное поясное время; -5,000000

или что-то вроде этого

Америка/Триатлон, Восточное лето летнее время; -4.000000

Спасибо за помощь!

С уважением

+1

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

+0

Вы спрашиваете о том, как получить все часовые пояса в мире, или как получить «местное время», как определено в ОС компьютера, на котором работает ваш код? –

+1

Кроме того, ознакомьтесь с [JodaTime] (http://joda-time.sourceforge.net/), который считается лучшей библиотекой даты и времени в целом. –

ответ

2

Использование getDisplayName(daylight, style), переходящие в true для daylight. Это будет печатать:

America/New_York;Eastern Daylight Time; -4.000000 

Но вы должны определить, является ли текущее время в летнее время или нет (или он всегда будет возвращаться «Daylight Time», даже осенью и зимой). Это должно сделать трюк:

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

Спасибо. Ты мой герой! Я протестировал его. Просто убедитесь, что я правильно понимаю. Ваш код правильно определяет и отображает, находится ли каждая зона в стандартном или летнем времени и смещении, правильно? – curious1

+0

Фактически, он может работать только для вашего часового пояса; Я не тестировал это так широко, но вы могли бы изменить настройки часового пояса на вашем компьютере и попробовать разные даты (например, летнее время в США начинается до летнего времени в Европе, поэтому проверяйте эти даты). Также обратите внимание, что если вы хотите смещение без учета летнего времени, используйте tz.getRawOffset() (без аргумента). Например, в восточном часовом поясе, который вернется -5 часов, независимо от дня года. – Jimothy

+0

Jimothy, я пробовал разные даты и часовые пояса, кажется, что список часовых поясов и их информация верны. Опять же, спасибо! – curious1

Смежные вопросы