ruby-on-rails - zona - operaciones con fechas ruby
¿Cómo crear un nuevo objeto DateTime en una zona horaria específica(preferiblemente la zona horaria predeterminada de mi aplicación, no UTC)? (4)
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 de forma predeterminada, 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?
/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
El uso de in_time_zone
no funciona porque solo convierte la hora GMT en PDT, que es la hora incorrecta:
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)
Hago lo siguiente en ApplicationController para configurar la zona horaria a la hora del usuario.
No estoy seguro de si esto es lo que quieres.
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
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
Puede usar el objeto TimeWithZone ( Time.zone
) de Time.zone
para crear y analizar 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
Si lo tengo, normalmente solo especifico el utc_offset al crear una instancia de Time.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