Convertire UTC in ora locale in Rails 3

Ho problemi a convertire TimeWithZone UTC o TimeWithZone in ora locale in Rails 3.

Say moment è una variabile Time in UTC (ad es. moment = Time.now.utc ). Come posso convertire il moment nel mio fuso orario, avendo cura dell’ora legale (cioè utilizzando EST / EDT)?

Più precisamente, mi piacerebbe stampare “Lunedì 14 marzo, 9:00” se l’ora corrisponde a questa mattina alle 9 AM EDT e “Lunedì 7 marzo alle 9:00” se l’ora era 9 AM EST lo scorso lunedì.

Spero che ci sia un altro modo?

Modifica : inizialmente pensavo che “EDT” dovesse essere un fuso orario riconosciuto, ma “EDT” non è un fuso orario effettivo, più simile allo stato di un fuso orario. Ad esempio, non avrebbe senso chiedere Time.utc(2011,1,1).in_time_zone("EDT") . È un po ‘di confusione, dato che “EST” è un fuso orario effettivo, utilizzato in alcuni punti che non utilizzano l’ora legale e sono (UTC-5) per un anno.

Rails ha i suoi nomi. Guardali con:

 rake time:zones:us 

Puoi anche eseguire il rake time:zones:all per tutti i fusi orari. Per visualizzare più attività rake relative alle zone: rake -D time

Quindi, per convertire in EST, catering per l’ora legale automaticamente:

 Time.now.in_time_zone("Eastern Time (US & Canada)") 

Time#localtime ti darà l’ora nel fuso orario corrente della macchina che esegue il codice:

 > moment = Time.now.utc => 2011-03-14 15:15:58 UTC > moment.localtime => 2011-03-14 08:15:58 -0700 

Aggiornamento: se si desidera convertire in fusi orari specifici anziché il proprio fuso orario, si è sulla buona strada. Tuttavia, invece di preoccuparti di EST vs EDT, basta passare nel fuso orario orientale orientale – saprà in base al giorno se è EDT o EST:

 > Time.now.utc.in_time_zone("Eastern Time (US & Canada)") => Mon, 14 Mar 2011 11:21:05 EDT -04:00 > (Time.now.utc + 10.months).in_time_zone("Eastern Time (US & Canada)") => Sat, 14 Jan 2012 10:21:18 EST -05:00 

C’è in realtà una bella gem chiamata local_time dal basecamp per fare tutto questo solo sul lato client, credo:

https://github.com/basecamp/local_time

È facile configurarlo utilizzando la zona locale del tuo sistema, Solo nella tua applicazione.rb aggiungi questo

 config.time_zone = Time.now.zone 

Quindi, le guide dovrebbero mostrarti i timestamp nel tuo locale o puoi usare qualcosa come questa per ottenere il localtime

 Post.created_at.localtime 

Non so perché, ma nel mio caso non funziona come suggerito in precedenza. Ma funziona così:

 Time.now.change(offset: "-3000") 

Ovviamente è necessario modificare il valore di offset sul proprio.

Se lo stai facendo solo perché vuoi ottenere il fuso orario dell’utente, tutto ciò che devi fare è cambiare il fuso orario in config/applications.rb .

Come questo:

Rails, per impostazione predefinita, salverà il tuo record di tempo in UTC anche se specifichi il fuso orario corrente.

 config.time_zone = "Singapore" 

Quindi questo è tutto quello che devi fare e sei a posto.