web-dev-qa-db-fra.com

Comment changer le fuseau horaire par défaut pour Active Record in Rails?

Dans mon application.rb je suis tombé sur le commentaire suivant

# 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 = 'Eastern Time (US & Canada)'

Comme vous le voyez ci-dessus, j’ai fait config.time_zone en heure EST. Cependant, toujours lorsque les enregistrements sont créés dans la base de données, il semble que datetime est stocké au format UTC.

Dans le commentaire ci-dessus, ils disent 

... et convertissez automatiquement Active Record dans cette zone ...

Comment puis-je faire cela et où?

En outre, je déploierai ceci sur heroku aussi et je voudrais que le réglage soit reporté

116
Omnipresent

ajouter ce qui suit à application.rb fonctionne

 config.time_zone = 'Eastern Time (US & Canada)'
 config.active_record.default_timezone = :local # Or :utc
164
Omnipresent

J'ai décidé de compiler cette réponse car toutes les autres semblent incomplètes.

config.active_record.default_timezone détermine s'il faut utiliser Time.local (si défini sur: local) ou Time.utc (si défini sur: utc) lors de l'extraction des dates et des heures de la base de données. La valeur par défaut est: utc . http://guides.rubyonrails.org/configuring.html


Si vous souhaitez modifier le Rails fuseau horaire, mais que vous avez toujours enregistrement actif enregistré dans la base de données sous UTC, utilisez

# application.rb
config.time_zone = 'Eastern Time (US & Canada)'

Si vous souhaitez modifier Rails _ fuseau horaire ET avoir Enregistrement actif enregistrer des heures dans ce fuseau horaire, utilisez

# application.rb
config.time_zone = 'Eastern Time (US & Canada)'
config.active_record.default_timezone = :local

Attention: vous devriez vraiment y réfléchir à deux fois, voire même trois fois, avant de sauvegarder vos temps dans la base de données dans un format autre que UTC.

Remarque
N'oubliez pas de redémarrer votre serveur Rails après avoir modifié application.rb.


Rappelez-vous que config.active_record.default_timezone ne peut prendre que deux valeurs

  • : local _ (convertit dans le fuseau horaire défini dans config.time_zone)
  • : utc (converti en UTC)

Voici comment vous pouvez trouver tous les fuseaux horaires disponibles

rake time:zones:all
147

Je suis arrivé à la même conclusion que Dean Perry après beaucoup d'angoisse. config.time_zone = 'Adelaide' et config.active_record.default_timezone = :local était la combinaison gagnante. Voici ce que j'ai trouvé pendant le processus.

34
James Barona

Dans mon cas (Rails 5), j'ai fini par ajouter ces 2 lignes dans mon app/config/environments/development.rb

config.time_zone = "Melbourne"
config.active_record.default_timezone = :local

C'est tout! Et pour m'assurer que Melbourne était bien lu, j'ai lancé la commande dans mon terminal: 

bundle exec rake time:zones:all 

et Melbourne était dans le fuseau horaire dans lequel je me trouve!

17
Carole

Si vous souhaitez définir le fuseau horaire sur UTC globalement, vous pouvez effectuer les opérations suivantes dans Rails 4:

# Inside config/application.rb
config.time_zone = "UTC"
config.active_record.default_timezone = :utc

Assurez-vous de redémarrer votre application ou vous ne verrez pas les modifications.

9
sergserg

Sur Rails 4.2.2, accédez à application.rb et utilisez config.time_zone='city' (par exemple, «Londres», «Bucarest» ou «Amsterdam», etc.).

Il devrait fonctionner parfaitement. Cela a fonctionné pour moi.

2
Andrei Laslo

Je devais ajouter ce bloc à mon fichier environment.rb et tout allait bien :)

Rails.application.configure do
    config.time_zone = "Pacific Time (US & Canada)"
    config.active_record.default_timezone = :local
end
  • Je l'ai ajouté avant la ligne Rails.application.initialize!
2
Taylor A. Leach

pour les utilisateurs chinois, ajoutez simplement deux lignes ci-dessous pour vous config/application.rb

config.active_record.default_timezone = :local
config.time_zone = 'Beijing'
0