2015-08-20 14 views
6

Sto usando Rails 4.2. Ho un Date che mi piacerebbe convertire in un DateTime. Se utilizzo il metodo to_datetime esistente, lo converte in GMT. (Ho guardato le discussioni per circa un'ora la società e non sono riuscito a trovare questo problema esatto, in modo scuse in anticipo se esiste!)Qual è il modo migliore per convertire una data in un DateTime nel fuso orario corrente in Rails 4?

irb(main):030:0> Date.current 
=> Wed, 19 Aug 2015 
irb(main):031:0> Date.current.to_datetime 
=> Wed, 19 Aug 2015 00:00:00 +0000 

Se dunque io cerco di usare in_time_zone, lo converte alla corrente fuso orario ma sottrae anche l'offset dalla data.

irb(main):032:0> Date.current.to_datetime.in_time_zone 
=> Tue, 18 Aug 2015 17:00:00 PDT -07:00 

Come posso convertire un esistente Date ad un DateTime nel fuso orario corrente?

+0

Qual è il fuso orario "corretto"? Cosa restituisce 'Time.zone'? – sebkkom

+0

Cambiato da "corretto" a "attuale", che è PST. –

+0

'Time.zone' restituisce' PST' allora? – sebkkom

risposta

8

Ecco la risposta migliore che potrei trovare.

Time.zone.at(Date.current.to_time).to_datetime 
+3

'Date.current.to_time' utilizza in realtà il fuso orario locale per impostazione predefinita, quindi' Date.current.to_time.to_datetime' dovrebbe funzionare allo stesso modo. – zuo

+0

Grazie! Modificato nella risposta –

+1

ma il fuso orario locale potrebbe non essere uguale al fuso orario delle rotaie impostato in 'application.rb' con config, quindi penso che' Time.zone.at' possa ancora essere una scelta migliore in ambiente rails – zuo

3

ho avuto un problema simile, e ho fatto questo:

Time.use_zone("Europe/Berlin") do 
    midnight = Time.zone.parse(@date.to_s) 
end 

Che sostanzialmente ri-crea la data come istanza Tempo pur essendo nel fuso orario di destinazione, a mezzanotte, senza "in movimento" l'istanza Time in giro.

+0

Questo ha funzionato per me, ma non ho dovuto usare il blocco "Time.use_zone' perché l'app ha già configurato il giusto fuso orario. Fondamentalmente 'begin_of_day = Time.zone.parse (@ date.to_s)' –

Problemi correlati