2009-09-06 14 views
90

Mis created_at marcas de tiempo se almacenan en UTC:convertir el tiempo de un huso horario a otro en los carriles

>> Annotation.last.created_at 
=> Sat, 29 Aug 2009 23:30:09 UTC +00:00 

¿Cómo convierto una de ellas a 'Hora del Este (Estados Unidos & Canadá)' (teniendo en cuenta la luz del día ahorros)? Algo así como:

Annotation.last.created_at.in_eastern_time 

Respuesta

159

Utilice el método in_time_zone de la clase DateTime

Loading development environment (Rails 2.3.2) 
>> now = DateTime.now.utc 
=> Sun, 06 Sep 2009 22:27:45 +0000 
>> now.in_time_zone('Eastern Time (US & Canada)') 
=> Sun, 06 Sep 2009 18:27:45 EDT -04:00 
>> quit 

Así que para su ejemplo particular

Annotation.last.created_at.in_time_zone('Eastern Time (US & Canada)') 
+6

o simplemente puede usar hora ident 'now.in_time_zone (3)' ' – fl00r

+7

created_at.in_time_zone ("EST") 'es más corto – Orlando

+40

" EST "=" Hora estándar del Este ", por lo que será incorrecto durante el horario de verano. "Hora del Este (EE. UU. Y Canadá)" se da cuenta si es DST o no para usted. – jhiro009

2

Configure su huso horario a tiempo del este.

Puede configurar su zona horaria por defecto en config/environment.rb

config.time_zone = "Eastern Time (US & Canada)" 

Ahora todos los registros que se extraiga será en esa zona horaria. Si necesita diferentes zonas horarias, por ejemplo, según la zona horaria del usuario, puede cambiarla con un filtro anterior en su controlador.

class ApplicationController < ActionController::Base 

    before_filter :set_timezone 

    def set_timezone 
    Time.zone = current_user.time_zone 
    end 
end 

Solo asegúrate de estar almacenando todos tus tiempos en la base de datos como UTC y todo será dulce.

+2

Me gustaría evitar 'Time.zone = ..'Como no es seguro para subprocesos. – gertas

+0

¿Esto importa si está ejecutando un servidor de aplicaciones como mestizo, delgado o pasajero? ¿Funcionan más de una instancia, un solo hilo, creo? ¡Puedo estar equivocado, me encantaría saber! – nitecoder

+4

'Time.zone =' es seguro para subprocesos https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/time/zones.rb#L36-38. – lest

8

Si se agrega esto a su /config/application.rb

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

A continuación, puede celular

Annotation.last.created_at.in_time_zone 

para obtener la hora en la zona horaria especificada.

14

Aunque esta es una vieja pregunta, vale la pena mencionar algo. En un previous reply, se sugiere utilizar un before_filter para establecer temporalmente la zona horaria.

Debe nunca, nunca hacer eso porque Time.zone almacena la información en el hilo, y probablemente se filtre a la siguiente solicitud manejada por ese hilo.

En su lugar, debe utilizar un filtro around_filter para asegurarse de que Time.zone se restablece después de completar la solicitud. Algo así como:

around_filter :set_time_zone 

private 

def set_time_zone 
    old_time_zone = Time.zone 
    Time.zone = current_user.time_zone if logged_in? 
    yield 
ensure 
    Time.zone = old_time_zone 
end 

leer más sobre este here

+0

Hay un buen método [Time.use_zone] (https://apidock.com/rails/Time/use_zone/class) hoy en día. – freemanoid

2

Si configura su /config/application.rb

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

Time.now.in_time_zone 

DateTime.now.in_time_zone 
Cuestiones relacionadas