¿Cómo cambiar la zona horaria de un objeto TimeWithZone?

Tengo un Coupon modelo con un atributo expired_at , de la clase DateTime y antes de guardar el registro, deseo cambiar la parte de la zona del campo según la elección del usuario. Decir,

 c = Coupon.new c.expired_at = DateTime.now c.expired_at_timezone = "Arizona" c.save! 

Y en coupon.rb :

 class Coupon < ActiveRecord::Base def before_save # change the zone part here, leave the date and time part alone end end 

Lo que estoy diciendo es que si el administrador desea que el cupón 2014-07-01 10:00 am , hora de Arizona, la fecha de expired_at almacenada en el DB debe ser algo como esto:

 Tue, 01 Jul 2014 10:00:00 MST -07:00 

¿Hay alguna manera de modificar solo la parte de la zona y dejar la parte de la fecha y la hora en paz?

Gracias

Puede cambiar la zona horaria predeterminada para su aplicación de Rails cambiando config.time_zone en su environment.rb . Por lo general, por defecto se establece en UTC.

En su caso, cada cupón tiene su propia zona horaria. Así que tienes que usar un enfoque diferente. No tienes que cambiar tu lógica de save . Solo necesitas cambiar tu lógica de recuperación. Utilice el método in_time_zone de la clase Time.

 c = Coupon.last p c.expired_at.in_time_zone(c.expired_at_timezone) # => Tue, 09 Mar 2010 02:06:00 MST -07:00 

De lo contrario, puede anular el método expired_at de su modelo de cupón.

 def expired_at # access the current value of expired_at from attributes hash attributes["expired_at"].in_time_zone(self.expired_at_timezone) end 

Ahora puedes hacer lo siguiente:

 p Coupon.last.expired_at # => Tue, 09 Mar 2010 02:06:00 MST -07:00 

Es mejor guardar todas las fechas en UTC, ya que puedes compararlas por TimeZone.