2009-09-07 6 views
10

Sto cercando di ottenere un fuso orario per un utente.C'è un modo per ottenere un fuso orario con (solo) un codice paese (codice ISO-3166 valido)?

Per questo ho un codice paese che è un codice paese ISO valido. Questi codici sono i codici maiuscoli e minuscoli come definiti da ISO-3166. Potete trovare un elenco completo di questi codici in un certo numero di siti, come ad esempio: http://www.chemie.fu-berlin.de/diverse/doc/ISO_3166.html

Credo che la risposta è "no, perché è un rapporto ManyToMany ... Ci possono essere molte fuso orario per un paese come Stati Uniti d'America. .. ". Questo è il problema ...

Ho tryied qualcosa come:

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

Ma tornare sempre TimeZone server ...

Tutte le idee?

risposta

3

Hai esattamente ragione. Lì è senza fuso orario per gli Stati Uniti, o la Russia, o vari altri "grandi" paesi (in termini di est/ovest).

Gli Stati Uniti sono sicuramente un semplice esempio: quale fuso orario vorresti utilizzare? America/Los_Angeles? America/New_York? Qualcos'altro?

+1

interessante ci sono altri grandi paesi in un singolo fuso orario; Sia l'India che la Cina rientrano in questa categoria. L'India coprirà normalmente due fusi orari; La Cina coprirebbe 4 fusi orari. –

+2

Yup - alcuni paesi hanno scelto di essere sani di mente quando si tratta di fusi orari :) –

+1

Sanità - sì; di un tipo. Ma in Cina, se il sole sorge alle 5 del mattino sulla costa orientale, non sale fino alle 8 del mattino sul bordo occidentale del deserto del Gobi. E se tramonta alle 19:00 sulla costa orientale, non tramonta fino alle 10 di sera a ovest. –

0

Non sono a conoscenza di nulla che ti dia questo (come Jon ha sottolineato che il caso d'uso è piuttosto limitato) ma potresti creare una mappa usando this data. L'elenco sarebbe una mappa multipla, quindi forse lo utilizzeresti da Google Collections o utilizzerai il tuo codice ISO-> Elenco <String> mappa.

Data la stringa del fuso orario, è possibile creare un oggetto TimeZone e passare da lì. Tuttavia, se il Paese ha più di un fuso orario, devi decidere come gestirlo.

+0

Esattamente, è la soluzione migliore per me. Penso che probabilmente mapperò i fusi orari con un paese, per avere un fuso orario univoco per nazione. – ajeanson

6

A Locale non è un TimeZone e viceversa. Controllare il Javadoc per il metodo che si sta utilizzando - la prima riga dice

Ottiene un calendario utilizzando il fuso orario predefinito e impostazioni locali specificate.

Ecco perché ottieni il fuso orario predefinito, poiché non ne hai specificato uno quando ottieni un calendario.

pensare a quello che ha detto Jon - se si sa cosa fuso orario che si desidera utilizzare nella situazione in cui hai lavorato un utente viene dagli Stati Uniti, allora si può chiamare il metodo Calendar.getInstance che prende un fuso orario e un locale. D'altra parte, se non puoi dire definitivamente cosa faresti qui, allora torna al tavolo da disegno e pensa un po 'di più alle tue esigenze, piuttosto che guardare alla tua implementazione.

Se non è possibile rispondere alla domanda precedente, penso che il ricorso standard della maggior parte dei siti Web sia consentire agli utenti di specificare il proprio fuso orario preferito (se hanno un account persistente sul server) e impostarli di default sul fuso orario del server se non hanno detto diversamente. Se non hanno account persistenti e forniscono informazioni all'utente con tempi (ad esempio un caricamento XML), dovranno specificare il fuso orario che stanno utilizzando nella richiesta o (probabilmente meglio) imposti l'uso di UTC per tutte le volte.

+0

non solo, ma il costruttore di 'Locale' arg singolo specifica la lingua, non il paese. – akf

-2

Il database olson contiene tutti i mapping. Link

Cercare il file zone.tab.

4
+1

Questo è utile, ma la lista restituita sembra essere in ordine alfabetico per nome; è un peccato che ICU4J non fornisca un modo per ottenere il "timezone meno sorprendente per il codice del paese" a scopo di visualizzazione; molto probabilmente questo sarebbe quello della capitale. –

-2

Hai provato il TZInfo gioiello?

È possibile ottenere i fusi orari di un paese in questo modo:

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

questa è una domanda Java –

-1

Ecco la soluzione che state cercando:

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

Il languageTag è il codice come en_US o ru_RU

+0

No, restituirà 'TimeZone.getDefault()' –

Problemi correlati