2009-09-07 1 views
10

Я пытаюсь получить TimeZone для пользователя.Есть ли способ получить timeZone (только) код страны (действительный код ISO-3166)?

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

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

Я tryied что-то вроде:

//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 ...

Любые идеи?

ответ

3

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

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

+1

Интересно , в одном часовом поясе есть другие крупные страны; как Индия, так и Китай относятся к этой категории. Индия обычно охватывает два часовых пояса; Китай будет охватывать 4 часовых пояса. –

+2

Yup - некоторые страны выбрали здравый смысл, когда дело доходит до часовых поясов :) –

+1

Sanity - yes; одного вида. Но в Китае, если солнце поднимается в 5 часов утра на восточном побережье, оно не поднимается примерно до 8 утра на западном краю пустыни Гоби. И если он будет установлен в 7 часов вечера на восточном побережье, он не будет установлен до 10 часов вечера на западе. –

0

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

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

+0

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

6

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

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

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

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

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

+0

не только это, но единственный конструктор arg 'Locale' указывает язык, а не страну. – akf

-2

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

Поиск файла zone.tab.

4

Вы можете использовать ICU4J для этого ... См http://helpdesk.objects.com.au/java/can-i-find-all-available-timezones-for-a-country

+1

Это удобно, но список возвращен, кажется, в алфавитном порядке по названию; стыдно, что ICU4J не предоставляет способ получить «наименее удивительный часовой пояс для кода страны» для показа; скорее всего, это будет столица. –

-2

Вы пробовали TZInfo камень?

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

>> 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"] 
+0

это вопрос Java –

-1

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

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

languageTag это код, как en_US или ru_RU

+0

Нет, это вернет 'TimeZone.getDefault()' –

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