2011-03-29 19 views
7

Tengo aplicación Rails3 con el usuario de modelo y de campo expires_at creado de esta manera:¿Cómo guardar las fechas en la zona horaria local a db con rails3?

t.column :expires_at, :timestamp 

En mi base de datos (PostgreSQL) que tiene tipo:

timestamp without timezone 

El problema es cuando llamo:

@user.expires_at = Time.now 
@user.save 

se guarda en la base de datos con la zona horaria UTC (mi hora local es UTC + 1:00, Varsovia) pero no quiero eso. Solo quiero tener tiempo con mi zona horaria local guardada en la base de datos (2011-03-30 01: 29: 01.766709, no 2011-03-29 23: 29: 01.766709)

¿Se puede lograr esto usando rails3?

+1

¡Cuidado! Si tienes usuarios en más de una zona horaria, esto se convertirá en un desastre rápido. Prefiero mantener todos mis tiempos como UTC en la base de datos, y solo convertirlos a no UTC para mostrarlos en el lado del cliente (puede convertir una hora de UTC a la zona horaria configurada en el sistema operativo de un usuario con un poco de JavaScript) . ¡Buena suerte! –

+0

¿qué ocurre con las consultas a la base de datos cuando recibo información del usuario? ¿ActiveRecord lo conversa con UTC automáticamente? –

+0

Esa es una buena pregunta, pero lo dudo: debería conocer la zona horaria del usuario para poder realizar la conversión correcta. Si desea almacenar las fechas proporcionadas por el usuario como UTC, probablemente tendrá que convertirlas en el lado del cliente (urgh). He usado [date.js] (http://www.datejs.com/) para mis conversiones del lado del cliente, pero solo he hecho la visualización - Nunca he aceptado las fechas como entrada ... –

Respuesta

10

Para ahorrar tiempo en la zona horaria local de base de datos de esto tiene que ser puesto en application.rb

config.active_record.default_timezone = :local 
+0

Esto no No funcionará si está utilizando Resque. No estoy seguro de cómo lidiar con resque. – Trip

2

Si sólo desea utilizar las horas locales en ciertas columnas, en lugar de como una configuración global, entonces el Rails documentation nos dice esto:

# If your attributes are time zone aware and you desire to skip time zone conversion to the current Time#zone when reading certain attributes then you can do following: 

class Topic < ActiveRecord::Base 
    self.skip_time_zone_conversion_for_attributes = [:written_on] 
end 

(Esto también omite la conversión de zona horaria al escribir, no solo leer). Y puede pasar una serie de símbolos para múltiples atributos.

No estoy seguro de las versiones de Rails en las que se introdujo.

+0

Parece que no se salta la zona horaria al escribir (es decir, todavía se convierte en UTC), ¿cómo lo verifica? Cuando consulto mediante 'psql', veo todos los valores convertidos a UTC, en lugar de en la zona horaria original. – vemv

+0

también necesita establecer 'config.active_record.time_zone_aware_attributes = false' para evitar la conversión a UTC al guardar en la base de datos – Turgs

Cuestiones relacionadas