2012-03-10 9 views
21

In un'applicazione Rails 3.x, è necessario visualizzare le abbreviazioni dei fusi orari (EST, PST, CST, ecc.) Anziché il nome completo del fuso orario. Ho visto un numero di discussioni che sembrano affrontare il problema, ma in maniere eccessivamente prolisse.Come tradurre i nomi completi del fuso orario nelle abbreviazioni tz?

C'è una gemma o un metodo molto conciso per gestire ciò che potrebbe essere utilizzato per mapparli correttamente?

risposta

28

Per il fuso orario corrente:

Time.zone.now.strftime('%Z') 

O per un elenco dei fusi orari:

ActiveSupport::TimeZone.us_zones.map do |zone| 
    Time.now.in_time_zone(zone).strftime('%Z') 
end 

Funziona, ma ancora sembra che ci dovrebbe essere un modo migliore ...

+1

Fammi sapere se trovi una soluzione ancora migliore. Grazie per la condivisione. – ylluminate

+0

Questo fallirà sicuramente nel seguente caso 2.2.2: 059> Time.now.in_time_zone ("Indiana (East)"). Strftime ('% Z') => "EDT" 2.2.2: 060> Ora .now.in_time_zone ("Eastern Time (Stati Uniti e Canada)"). strftime ('% Z') => "EDT" – AMBasra

2

Bene, se si lascia che gli utenti scelgano il proprio fuso orario, è possibile rendere l'abbreviazione del fuso orario come parte del formato datetime. Provare qualcosa di simile in te appliction_helper.rb, quindi utilizzarlo in una vista per formattare un oggetto datetime:

def format_datetime(datetime) 
    datetime.strftime "%-d %b %Y, %H:%M %Z" 
end 

Aggiornamento

Se stai facendo geolocalizzazione in base all'indirizzo IP degli utenti, quindi puoi eseguire una ricerca nel fuso orario in base a tale posizione. Questa domanda è stata già posta prima, ma per quanto riguarda la latitudine/longitudine piuttosto che il nome del fuso orario indicato.

Avere una lettura di questo: Timezone lookup from latitude longitude

+0

sto tirando nel fuso orario tramite il loro rilevamento della geolocalizzazione ip +, quindi sto risolvendolo dal nome più lungo. – ylluminate

+0

In realtà la mia domanda è un po 'più specifica. Ho geolocalizzazione che funziona bene. Il problema finora è che il risultato è la versione più lunga del fuso orario. Sto cercando di ottenere EST (EDT), PST (PDT), UTC, IST, ecc. – ylluminate

5
Time.now.zone 
# => "UTC" 

Per utilizzare il fuso orario predefinito (se impostato) è possibile utilizzare:

Time.zone.now.zone 
# => "CDT" 

Maggiori informazioni su questo: http://api.rubyonrails.org/classes/Time.html#method-c-zone-3D

+0

Anche questo non riuscirà nel seguente caso Time.now.in_time_zone ("Eastern Time (US & Canada)").zona => "EDT" 2.2.2: 065> Time.now.in_time_zone ("Indiana (East)"). zona => "EDT" È ingannevole per il risparmio di luce diurna e per le zone che hanno gli stessi tempi per l'esempio sopra menzionate entrambe le zone sono GMT -5. Quindi il rubino è confuso. – AMBasra

4

ho guardato tutto per questa risposta, e ho finalmente trovato ciò che cercavo. Lascio qui la risposta in modo che altri potrebbero non dover apparire il più a lungo e difficile come ho dovuto.

Se si ha accesso a ActiveSupport e trattare con gli oggetti di fuso orario come questo:

timezone = ActiveSupport::TimeZone.all[44] 

allora si può arrivare alla sigla in questo modo:

timezone.tzinfo.current_period.abbreviation 
+0

le informazioni sulla zona sono in tzinfo, tuttavia questo è fondamentalmente un modo più lungo di fare semplicemente quello che ifightcrime menzionato sopra ... ad esempio, User.take.created_at.zone – hellion

+0

Puoi anche usare 'strftime' per ottenere l'abbreviazione direttamente dal Istanza 'TZInfo :: TimezoneProxy'. – roflmyeggo

Problemi correlati