2012-07-12 11 views
29

He configurado el huso horario en /config/application.rb, y espero que todos los tiempos generados en mi aplicación estén en esta zona horaria por defecto, pero cuando creo un nuevo objeto DateTime (usando .new), lo crea en GMT. ¿Cómo puedo conseguir que esté en la zona horaria de mi aplicación?Cómo crear un nuevo objeto DateTime en un huso horario específico (preferiblemente el huso horario predeterminado de mi aplicación, no UTC)?

/config/application.rb

config.time_zone = 'Pacific Time (US & Canada)' 

IRB

irb> DateTime.now 
=> Wed, 11 Jul 2012 19:04:56 -0700 

irb> mydate = DateTime.new(2012, 07, 11, 20, 10, 0) 
=> Wed, 11 Jul 2012 20:10:00 +0000     # GMT, but I want PDT 

Usando in_time_zone no funciona debido a que simplemente convierte la hora GMT en cuando PDT, que es el mal hora:

irb> mydate.in_time_zone('Pacific Time (US & Canada)') 
=> Wed, 11 Jul 2012 13:10:00 PDT -07:00    # wrong time (I want 20:10) 

Respuesta

27

Puede utilizar (Time.zone) objeto de ActiveSupport TimeWithZone para crear y analizar las fechas en la zona horaria de su aplicación:

1.9.3p0 :001 > Time.zone.now 
=> Wed, 11 Jul 2012 19:47:03 PDT -07:00 
1.9.3p0 :002 > Time.zone.parse('2012-07-11 21:00') 
=> Wed, 11 Jul 2012 21:00:00 PDT -07:00 
+1

¡Esto es realmente útil! Pero, ¿qué ocurre si desea crear un tiempo en una zona diferente a la que configuró config.time_zone = en config/application.rb? – idrinkpabst

+0

Usaría algo como ''2012-07-11 21: 00'.to_datetime.in_time_zone (' Eastern Time (US & Canada) ')' –

+2

Esto en realidad no funciona. digamos que quieres crear un tiempo en la zona para las 9 am, hora del este. si lo hace '2012-07-11 09: 00'.to_datetime.in_time_zone (' Eastern Time (US & Canada) '), esto le devuelve el momento incorrecto porque se está convirtiendo de UTC. si lo hace '2012-07-11 09:00, hora del Este (EE. UU. y Canadá)'. hasta la hora del este (EE. UU. y Canadá), esto todavía no funciona porque DateTime es complicado cuando se trata de la luz del día tiempo de ahorro Es mejor evitar DateTime por completo. ¿Algunas ideas? – idrinkpabst

0

Hago lo siguiente en ApplicationController para configurar la zona horaria a la hora del usuario.

No estoy seguro de si esto es lo que quiere.

class ApplicationController < ActionController::Base 
    before_filter :set_timezone 
    def set_timezone 
    # current_user.time_zone #=> 'London' 
    Time.zone = current_user.time_zone if current_user && current_user.time_zone 
    end 

end 
+1

Esto no es lo que estaba buscando, pero gracias por publicar .. Tal vez sea útil a alguien más. – user664833

6

Si lo tengo, por lo general sólo especificar el utc_offset cuando una instancia de Tiempo .new o DateTime.new.

[1] pry(main)> Time.new(2013,01,06, 11, 25, 00) #no specified utc_offset defaults to system time 
=> 2013-01-06 11:25:00 -0500 
[2] pry(main)> Time.new(2013,01,06, 11, 25, 00, "+00:00") #UTC 
=> 2013-01-06 11:25:00 +0000 
[3] pry(main)> Time.new(2013,01,06, 11, 25, 00, "-08:00") #PST 
=> 2013-01-06 11:25:00 -0800 
8

Otra forma sin análisis de cadenas:

irb> Time.zone.local(2012, 7, 11, 21) 
=> Wed, 07 Nov 2012 21:00:00 PDT -07:00 
Cuestiones relacionadas