2010-12-06 20 views
28

Tengo un problema bastante común, pero por alguna razón he intentado todas las sugerencias en la web y ninguna parece funcionar.Timezone with rails 3

he puesto la zona horaria en la configuración de 'EST'

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

Pero cuando el tiempo se muestra en la pantalla, que sigue mostrando la hora UTC que se almacena en la base de datos. Probé el depurador y aquí está la salida

(rdb:1) Time.zone 
#<ActiveSupport::TimeZone:0x1061f4760 @utc_offset=nil, @current_period=nil, @name="Eastern Time (US & Canada)", @tzinfo=#<TZInfo::TimezoneProxy: America/New_York>> 
(rdb:1) Order.first.placed_at 
Fri Jan 01 15:00:00 UTC 2010 

Actualización: Aquí hay otro usuario que tiene la misma pregunta Rails timezone is wrong when shown

+0

Más sobre zonas horarias: http://api.rubyonrails.org/classes/ActiveSupport/TimeZone.html –

Respuesta

36

Trate in_time_zone. Por ejemplo

>> Time.now 
=> Sun Dec 05 21:34:45 -0500 2010 
>> Time.zone 
=> #<ActiveSupport::TimeZone:0x1033d97b8 @name="Pacific Time (US & Canada)", @tzinfo=#<TZInfo::DataTimezone: America/Los_Angeles>, @utc_offset=-28800, @current_period=nil> 
>> Time.now.in_time_zone 
=> Sun, 05 Dec 2010 18:34:54 PST -08:00 

En su caso, usted quiere Order.first.placed_at.in_time_zone.

+4

pero pensé establecer la zona horaria en la configuración automáticamente indicaría activerecord para recuperar en la zona horaria local .. http://ryandaigle.com/articles/2008/1/25/what-s-new-in-edge-rails-easier-timezones – Addy

+0

En mi experiencia, yo tuvo que decirle explícitamente a la vista que use la zona horaria local (en lugar de UTC). Quizás exista una mejor manera. –

+0

Esto me estaba volviendo loco. ¡Gracias una tonelada! :-) –

2

Compruebe que su ActiveRecord::Base.time_zone_aware_attributes es verdadero.

11

Si desea establecer una zona horaria diferente para diferentes usuarios de su aplicación, asegúrese de usar un around_filter en lugar de un filtro antes para cambiar Time.zone. Algo relacionado con cómo Time.zone se filtra a otros hilos y, por lo tanto, otros usuarios pueden incluir un huso horario que no deberían. A partir de esta entrada del blog: http://ilikestuffblog.com/2011/02/03/how-to-set-a-time-zone-for-each-request-in-rails/

en application_controller.rb:

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 

también he encontrado útil usar el método de ayuda time_zone_select forma al permitir a los usuarios cambiar su zona horaria. Si se llama a su campo: time_zone, que lo utilizaría como:

f.time_zone_select(:time_zone) 

Y, por último, esto se ve muy impresionante. Detección automática y configuración de zona horaria a través de javascript. Aquí está la joya carriles para añadir a la tubería de activos: https://github.com/scottwater/detect_timezone_rails y entrada de blog de acompañamiento: http://www.scottw.com/automated-timezone-detection

+0

respuesta perfecta, si me preguntas !! – pungoyal