2009-11-08 1 views
24

Я разрешаю пользователям моего веб-приложения планировать события на основе часовых поясов по их выбору.TimeZones в Java

Я хочу предоставить хороший список часовых поясов конечному пользователю, а затем легко преобразовать его в объект java.util.TimeZone на сервере.

String[] TimeZone.getAvailableIds() это то, что я мог бы использовать, но проблема в том, что он печатает около 585 идентификаторов часовых поясов.

Каков наилучший способ предоставить пользователю краткий список часовых поясов (например, окно Windows для настроек часового пояса) и легко преобразовать объект TimeZone на конец сервера, используя его идентификатор?

+0

В качестве ссылки, Wikipedia хранит [список имен часовых поясов] (http://en.wikipedia.org/wiki/List_of_tz_database_time_zones). –

ответ

20

Список часовых поясов очень специфичен для конкретного приложения и локали. Только вы знаете, какие зоны наиболее применимы для ваших пользователей. На самом деле у нас разные списки для разных регионов.

Вот наш список для пользователей США для справки,

"Pacific/Midway", 
    "US/Hawaii", 
    "US/Alaska", 
    "US/Pacific", 
    "America/Tijuana", 
    "US/Arizona", 
    "America/Chihuahua", 
    "US/Mountain", 
    "America/Guatemala", 
    "US/Central", 
    "America/Mexico_City", 
    "Canada/Saskatchewan", 
    "America/Bogota", 
    "US/Eastern", 
    "US/East-Indiana", 
    "Canada/Eastern", 
    "America/Caracas", 
    "America/Manaus", 
    "America/Santiago", 
    "Canada/Newfoundland", 
    "Brazil/East", 
    "America/Buenos_Aires", 
    "America/Godthab", 
    "America/Montevideo", 
    "Atlantic/South_Georgia", 
    "Atlantic/Azores", 
    "Atlantic/Cape_Verde", 
    "Africa/Casablanca", 
    "Europe/London", 
    "Europe/Berlin", 
    "Europe/Belgrade", 
    "Europe/Brussels", 
    "Europe/Warsaw", 
    "Africa/Algiers", 
    "Asia/Amman", 
    "Europe/Athens", 
    "Asia/Beirut", 
    "Africa/Cairo", 
    "Africa/Harare", 
    "Europe/Helsinki", 
    "Asia/Jerusalem", 
    "Europe/Minsk", 
    "Africa/Windhoek", 
    "Asia/Baghdad", 
    "Asia/Kuwait", 
    "Europe/Moscow", 
    "Africa/Nairobi", 
    "Asia/Tbilisi", 
    "Asia/Tehran", 
    "Asia/Muscat", 
    "Asia/Baku", 
    "Asia/Yerevan", 
    "Asia/Kabul", 
    "Asia/Yekaterinburg", 
    "Asia/Karachi", 
    "Asia/Calcutta", 
    "Asia/Colombo", 
    "Asia/Katmandu", 
    "Asia/Novosibirsk", 
    "Asia/Dhaka", 
    "Asia/Rangoon", 
    "Asia/Bangkok", 
    "Asia/Krasnoyarsk", 
    "Asia/Hong_Kong", 
    "Asia/Irkutsk", 
    "Asia/Kuala_Lumpur", 
    "Australia/Perth", 
    "Asia/Taipei", 
    "Asia/Tokyo", 
    "Asia/Seoul", 
    "Asia/Yakutsk", 
    "Australia/Adelaide", 
    "Australia/Darwin", 
    "Australia/Brisbane", 
    "Australia/Sydney", 
    "Pacific/Guam", 
    "Australia/Hobart", 
    "Asia/Vladivostok", 
    "Asia/Magadan", 
    "Pacific/Auckland", 
    "Pacific/Fiji", 
    "Pacific/Tongatapu", 
0

Невозможно использовать список пользовательских идентификаторов часового пояса с использованием обозначения «GMT +/- Hours» (пропуска минут)?

(EDIT: с моим первым предложением переход на летнее время не является автоматическим. Для решения этой проблемы вы можете сначала попросить пользователя выбрать смещение по GMT, а затем показать (связанный) список идентификаторов часовых поясов для заданное смещение с помощью:.

public static String[] getAvailableIDs(int rawOffset) 

Таким образом, пользователь сможет выбрать свой часовой пояс в короче списка (лучше для пользователя опыта) и выгоды от поведения при переходе на летнее)

+1

Спасибо. Да, но java.util.TimeZone, который будет создан с ним, автоматически не учитывает переход на летнее время. Если я создаю часовой пояс, используя: TimeZone.getTimeZone («America/Los_Angeles»), тогда мне не нужно беспокоиться о летнее время и т. Д. Или я ошибаюсь? – Vish

+0

Вы правы. Действительно, переход на летнее время с пользовательским идентификатором часового пояса не требуется. Я уточню свой ответ другим предложением. –

+0

Спасибо. Это тоже работает! – Vish

0

Если вам нужно гранулярность выбора именно того, как будет выглядеть список, я бы использовал лучший жесткий код I может найти (this is a good example) и обеспечить его отображение и преобразование как можно точнее.

Просто имейте в виду, что каждый из этих 585 часовых поясов имеет семантическое значение (например, DST, например), и пользователи могут захотеть выбрать для них лучший часовой пояс. Хотя я согласен, что список может быть намного короче.

+0

Я не вижу, как этот список может учитывать переход на летнее время, к сожалению .... –

0

Я сделал это для компании не владеют какой-либо из больше, так что не может предоставить код. JVM в Windows поставляется с файлом с именем tzmappings (смотрите в C:\Program Files\Java\jre6\lib или аналогичном), который отображает временные зоны Windows для зоны континентов/городов на основе зоны.

К сожалению, текстовые названия у tzmappings ужасные, поэтому вам нужно сделать несколько минут табуляции. Откройте regedit и перейдите к HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones. Под этим ключом для каждого часового пояса на машине; Windows 7 имеет около 90. Каждый ключ имеет значение Display, которое является текстовым именем, которое вы хотите; найдите ключ в tzmappings, чтобы найти идентификатор часового пояса Java для каждого из них.

0

С этим мною я бы не стал заставлять их переводить в список выбора. Я бы поместил их в список в отдельном модальном диалоговом окне (или всплывающее окно, если нужно), пусть пользователь прокрутите и щелкните по имени, которое они хотят. Они нажимают на ссылку в модальном диалоге и заполняют текстовое поле правильным кодом, и вы можете отправить его на свой сервер.

Еще лучше, попросите их щелкнуть по их местоположению на карте мира и использовать карту изображения, чтобы перевести это местоположение в соответствующий часовой пояс.

4

Вы можете сократить список с идентификаторами TZ, которые соответствуют только на следующий РегВыр

^(Africa|America|Asia|Atlantic|Australia|Europe|Indian|Pacific)/.* 
11

Я только что написал небольшую утилиту Java, которая предоставляет список часовых поясов для Windows (зоны в выборе часового пояса диалог в Windows) и связанные с ними объекты Java TimeZone. См https://github.com/nfergu/Java-Time-Zone-List

Это основано на CLDR отображений на http://unicode.org/repos/cldr/trunk/common/supplemental/windowsZones.xml

+0

Хорошая работа в TimeZoneList. Благодарим за сопоставление всех часовых поясов Microsoft с идентификаторами Java. – Peter

+0

Я согласен. Это место для того, что я искал. – JamesA

0

Просто, чтобы дополнить ответ на tbruyelle я добавил еще несколько стран (например, Канада), убрана «/» часть фильтра и служит средством для сортировки списка.

public static void main(String[] args) 
{ 
    List<String> simplifiedTimezoneList = getTimezoneIdList(); 

    for (String tz : simplifiedTimezoneList) 
     System.out.println(tz); 
} 

public static List<String> getTimezoneIdList() 
{ 
    String[] temp = TimeZone.getAvailableIDs(); 
    List<String> timezoneList = new ArrayList<String>(); 
    List<String> simplifiedTimezoneList = new ArrayList<String>(); 
    for (String tz : temp) 
    { 
     timezoneList.add(tz); 
    } 
    Collections.sort(timezoneList); 
    String filterList = "Canada|Mexico|Chile|Cuba|Brazil|Japan|Turkey|Mideast|Africa|America|Asia|Atlantic|Australia|Europe|Indian|Pacific"; 
    Pattern p = Pattern.compile("^(" + filterList + ").*"); 
    for (String tz : timezoneList) 
    { 
     Matcher m = p.matcher(tz); 
     if (m.find()) 
     { 
      simplifiedTimezoneList.add(tz); 
     } 
    } 
    return simplifiedTimezoneList; 
}