2011-10-17 17 views
9

Disculpe si esto es un problema de novato:Cómo guardar correctamente una zona horaria con Ruby y MongoId?

Tengo una aplicación donde los usuarios pueden establecer sus propias zonas horarias en su perfil.

Cuando alguien añade una alineación (terminología aplicación específica), hago lo siguiente:

time = ActiveSupport::TimeZone.new(user.timezone).parse(
    "Wednesday, 26 October, 2011 13:30:00" 
) 

# This outputs: 2011-10-26 13:30:00 +0200 - valid according to the user selected TZ 

entonces guardar la alineación:

Lineup.create({ 
    :date => time.gmtime, 
    :uid => user._id, 
    :pid => product._id 
}) 

Esto debería (en teoría) la fecha como gmtime, pero obtengo lo siguiente al ver el registro:

{ 
    "_id": ObjectId("4e9c6613e673454f93000002"), 
    "date": "Wed, 26 Oct 2011 13: 30: 00 +0200", 
    "uid": "4e9b81f6e673454c8a000001", 
    "pid": "4e9c6613e673454f93000001", 
    "created_at": "Mon, 17 Oct 2011 19: 29: 55 +0200" 
} 

Como puede ver, el campo de fecha está escrito ong: aún mantiene la zona horaria del usuario, debe ser GMT, no específica de la zona horaria.

Si time.gmtime de salida, me sale el momento adecuado (que se salven):

2011-10-26 11:30:00 UTC (correct) 

Alguna idea de cómo salvar a la fecha GMT por lo que en realidad se ahorra la fecha GMT?

Respuesta

11

Parece que necesita especificar el tipo de campo de su atributo de fecha. Usaría un campo de tiempo si quieres que mongoid maneje las zonas de manera adecuada.

class Lineup 
    include Mongoid::Document 
    field :date, type: Time 
end 

También es probable que quieren establecer lo siguiente en config/mongoid.yml

defaults: &defaults 
    use_utc: false 
    use_activesupport_time_zone: true 

Esto suena contradictorio, pero esta es la forma actual de hacer uso UTC MongoId como la zona horaria por defecto.

Finalmente, eche un vistazo a la gema mongoid-metastamp. Le brindará un soporte mucho mejor para realizar consultas en varias zonas horarias, sin dejar de funcionar como un campo de tiempo nativo.

+1

Esto también funciona con DateTime en las versiones actuales de Mongoid (estoy en 2.4.7). Ver https://github.com/mongoid/mongoid/issues/1135 –

Cuestiones relacionadas