Есть ли способ получить timeZone с (только) кодом страны (действительный код ISO-3166)?

Я пытаюсь получить TimeZone для пользователя.

Для этого у меня есть код страны, который является действующим кодом страны ISO. Эти коды представляют собой двухбуквенные коды в верхнем регистре, как определено в ISO-3166. Вы можете найти полный список этих кодов на нескольких сайтах, таких как: http://www.chemie.fu-berlin.de/diverse/doc/ISO_3166.html

Я думаю, что ответ "нет, потому что это очень много отношений... может быть много времени для такой страны, как США...". Это проблема...

Я попытался что-то вроде:

//CountryEnum contains ISO_3166 values (http://www.chemie.fu-berlin.de/diverse/doc/ISO_3166.html) 
  //List all country to test timezone:
  for (int i = 0; i < CountryEnum.values().length; i++) {
   String isoCountryCode = CountryEnum.values()[i].name();// Get the iso country code
   Locale locale = new Locale(isoCountryCode);// Build a country specific locale
   Calendar calendar = Calendar.getInstance(locale);// Build a calendar with the specific locale
   String timeZone = calendar.getTimeZone().getDisplayName();// Build a timeZone with the calendar
   System.out.println("LOCALE : "+locale+" / COUNTRY: "+isoCountryCode+" / TIMEZONE: "+timeZone);
  }

Но он всегда возвращает сервер TimeZone...

Любые идеи?

Ответ 1

A Locale не является TimeZone, и наоборот. Проверьте Javadoc для метода, который вы используете, - в самой первой строке говорится

Получает календарь с использованием часового пояса по умолчанию и указанной локали.

Вот почему вы получаете часовой пояс по умолчанию - поскольку вы не указали его при получении Календаря.

Подумайте о том, что сказал Джон: если вы знаете, какой часовой пояс вы бы хотели использовать в ситуации, когда вы разработали пользователь из США, вы можете вызвать метод Calendar.getInstance, который занимает часовой пояс и локали. С другой стороны, если вы не можете точно сказать, что вы здесь делаете, вернитесь к чертежной доске и немного подумайте о своих требованиях, а не посмотрите на свою реализацию.

Если вы не можете ответить на предыдущий вопрос, я думаю, что стандартное обращение к большинству веб-сайтов позволяет пользователям указывать предпочтительный часовой пояс (если у них есть постоянная учетная запись на сервере) и по умолчанию они относятся к серверному часовому поясу, если они не сказали иначе. Если у них нет постоянных учетных записей, и они предоставляют вам информацию во время (например, при загрузке XML), тогда им придется либо указать, какой часовой пояс они используют в запросе, либо (возможно, лучше) вы назначаете использование UTC на все времена.

Ответ 3

Ты совершенно прав. Нет ни одного часового пояса для США - или России или других других "больших" стран (с точки зрения Востока и Запада).

США, безусловно, простой пример - какой часовой пояс вы хотите использовать? America/Los_Angeles? America/New_York? Что-то еще?

Ответ 4

Я ничего не знаю о том, что дает вам это (поскольку Джон указал, что вариант использования довольно ограничен), но вы можете построить карту, используя this данные. Список будет мульти-картой, поэтому, возможно, вы будете использовать его в Google Collections или использовать свою собственную карту ISO-кода- > Список <String>.

С учетом строки часового пояса вы можете создать объект TimeZone и перейти оттуда. Однако, если страна имеет более одного часового пояса, вы должны решить, как с этим справиться.

Ответ 5

Здесь решение, которое вы ищете:

public String getTimeZoneByLocale(final String languageTag){
    final Locale locale = Locale.forLanguageTag(languageTag);
    final Calendar cal = Calendar.getInstance(locale);
    final TimeZone timeZone = cal.getTimeZone();
    return timeZone.getID();
}

ЯзыкTag - это код, например en_US или ru_RU

Ответ 6

База данных olson содержит все сопоставления. Ссылка

Найдите файл zone.tab.

Ответ 7

Вы пробовали TZInfo gem?

Вы можете получить часовые пояса страны таким образом:

>> TZInfo::Country.get("DE").zone_identifiers
=> ["Europe/Berlin", "Europe/Busingen"]
>> TZInfo::Country.get("CN").zone_identifiers
=> ["Asia/Shanghai", "Asia/Harbin", "Asia/Chongqing", "Asia/Urumqi", "Asia/Kashgar"]
>> TZInfo::Country.get("US").zone_identifiers
=> ["America/New_York", "America/Detroit", "America/Kentucky/Louisville",   "America/Kentucky/Monticello", "America/Indiana/Indianapolis", "America/Indiana/Vincennes", "America/Indiana/Winamac", "America/Indiana/Marengo", "America/Indiana/Petersburg", "America/Indiana/Vevay", "America/Chicago", "America/Indiana/Tell_City", "America/Indiana/Knox", "America/Menominee", "America/North_Dakota/Center", "America/North_Dakota/New_Salem", "America/North_Dakota/Beulah", "America/Denver", "America/Boise", "America/Phoenix", "America/Los_Angeles", "America/Anchorage", "America/Juneau", "America/Sitka", "America/Yakutat", "America/Nome", "America/Adak", "America/Metlakatla", "Pacific/Honolulu"]