2010-07-14 17 views
6

J'ai une base de données qui est écrite par une application non-rails et lu par une application rails. Il y a un champ datetime dans la base de données et les données stockées dans ce champ sont stockées dans Eastern Time. Dans mon application rails, je comprends que je peux définir le fuseau horaire de l'application dans mon fichier environment.rb en faisant config.time_zone = 'Eastern Time (US & Canada)'. Cependant, les rails supposent que les données stockées dans la base de données sont stockées dans UTC et convertis de config.time_zone à UTC comme il tire des informations dans et hors de la base de données.Rails/Activerecord base de données champ fuseau horaire

Existe-t-il un moyen de dire à des rails que les données dans ce champ particulier, ou même tous mes champs date/heure, sont Heure de l'Est et pas UTC?

Répondre

0

Ma première suggestion est de réparer l'autre application. L'autre application doit enregistrer un décalage UTC avec la date. Si vous essayez de contourner un problème, vous allez en créer plus. Par exemple, que se passe-t-il lorsque l'heure d'été passe, alors les décalages vont-ils changer?

Cela étant dit et ne pas avoir d'autre choix - je ferais quelque chose le long de ces lignes, pour un champ created_at:

def created_at_in_eastern 
    DateTime.parse(self.created_at.strftime("%D %T EST")) if self.created_at 
end 

ou vous pouvez utiliser EDT selon la façon dont les données sont enregistrées, il suffit de lire l'avertissement au sommet - c'est un hack!

1

config.active_record.default_timezone - Indique ActiveRecord à interpréter les temps de base de données comme étant dans la zone de temps spécifiée, et d'utiliser ce fuseau horaire pour travailler avec created_at & updated_at attributs.

8

On Rails 3.0.5 dans application.rb, cela fonctionne:

config.time_zone = 'Central Time (US & Canada)' 
config.active_record.default_timezone = :local