2011-07-09 16 views
9

¿Cuál es la mejor forma de manejar las fechas y zonas horarias en los rieles?Rieles y fechas, ¿están almacenados en UTC de forma predeterminada?

Scenerio: Tengo clientes que compran productos en un sitio web de todo el mundo, y cuando inician sesión, pueden elegir de qué zona horaria son.

Así que creo que debería estar almacenando todo en la base de datos en UTC, y luego en el front-end debería convertir las fechas a las preferencias de zona horaria establecidas por los usuarios.

¿Son sus problemas con Ruby and Rails y datetimes, etc.?

Soy nuevo en los rieles, así que estoy buscando orientación sobre cómo manejar esto correctamente.

+0

yo haría exactamente como describes : registrar todo como UTC. ¿Cuál es tu pregunta aquí sin embargo? – apneadiving

+0

¿el registro activo almacena cosas en UTC de forma predeterminada? – Blankman

+0

lo siento, estaba en el título ... – apneadiving

Respuesta

11

Afortunadamente, Rails se encargará de las cosas por usted. Como otros señalaron, las fechas son almacenadas por AR en formato UTC. Si usted tiene un campo time_zone para su tabla de usuarios que puede hacer algo como esto:

# application.rb 
config.time_zone = "Mountain Time (US & Canada)" # Default time zone 

-

# application_controller.rb 
before_filter :set_time_zone, :if => :logged_in? 

protected 
def set_time_zone 
    Time.zone = current_user.time_zone if current_user.time_zone 
end 

Todos los datetimes deben consignarse en la zona horaria correcta en sus puntos de vista.

He tenido una aplicación de producción que no me gustó usar la zona horaria predeterminada, pero no recuerdo qué versión de Rails/Ruby estaba ejecutando.

+0

gracias, espero haber entendido todo, ya que parece sencillo. ahora por problemas de dinero/moneda :) – Blankman

+1

@Blankman: por cuestión de dinero/monedas, consulte mi respuesta aquí: http://stackoverflow.com/questions/4798651/rails-money-gem-converts-all-amounts-to-zero/4800159 # 4800159 – apneadiving

1

Ok, eche un vistazo a su archivo config/application.rb.

líneas que debe encontrar comentó:

# Set Time.zone default to the specified zone and make Active Record auto-convert to this zone. 
# Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC. 
# config.time_zone = 'Central Time (US & Canada)' 

Así que por defecto es UTC pero se puede establecer lo que sea necesario ou allí.

1

Sí, lo son. En la aplicación, cada vez que visualiza la fecha o la hora para el usuario, todo lo que necesita es simplemente agregar el desplazamiento de la zona horaria (por ejemplo: date + 1.hour para GMT + 1). Recuerde que también debe ocuparse del horario de verano. Para la eficiencia, considere agregar 2 columnas en su tabla de usuario: zona horaria y time_offset. Luego, en cada caso, haga algo como

= @order.created_at + session[:user].time_offset 

En lugar de comprobar siempre el desplazamiento para cada zona horaria configurada en el perfil.

+0

Estoy confundido, ¿dijo que tiene 2 columnas pero su código no hace referencia a la columna de la zona horaria? – Blankman

+0

Está destinado a no tener. Usas la zona horaria cuando el usuario edita su perfil, es un nombre "amigable para los humanos". Cuando el usuario lo actualiza, lo compara con una tabla de zonas horarias y compensaciones, y establece time_offset para no volver a obtener esa compensación. – exine

+0

Está bien, veo que el mago de Ogz propuso una mejor solución, no sabía que Rails tenía algo así;) – exine

0

He encontrado

rake time:zones:all 

a ser realmente útil. Muestra una lista de compensaciones y luego cadenas de nombre de zona debajo de eso. por ejemplo:

* UTC +12:00 * 
Auckland 
Fiji 
Kamchatka 
Magadan 
Marshall Is. 
Solomon Is. 
Wellington 

que necesitaba más adelante en application.rb (no intuitiva cadena dada de tiempo predeterminado zona de "Hora de la Montaña (US & Canadá)"):

config.time_zone = 'Wellington' 
Cuestiones relacionadas