Wie ändere ich die Standardzeitzone für Active Record in Rails?

140

In meinem application.rbbin ich auf folgenden Kommentar gestoßen

# 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)'

Wie Sie von oben sehen, habe ich config.time_zoneEST-Zeit gemacht. Wenn jedoch Datensätze in der Datenbank erstellt werden, sieht es so aus, datetimeals würden sie im UTC-Format gespeichert.

Im obigen Kommentar heißt es

... und Active Record automatisch in diese Zone konvertieren lassen ...

Wie und wo kann ich das machen?

Außerdem werde ich dies auch auf Heroku bereitstellen und ich möchte, dass die Einstellung übernommen wird

Allgegenwärtig
quelle
In MySQL ist datetime ein zeitzonenloser Typ. Dh es könnte in jeder Zeitzone sein, die Sie wollen. Wenn Sie es als UTC behandeln, ist das in Ordnung. Aber Vorsicht, wenn jemand direkt in Ihre Datenbank schaut und sie anders interpretiert.
Vanuan

Antworten:

199

Ich habe beschlossen, diese Antwort zusammenzustellen, da alle anderen unvollständig zu sein scheinen.

config.active_record.default_timezone bestimmt, ob Time.local (wenn auf: local gesetzt) ​​oder Time.utc (wenn auf: utc gesetzt) ​​verwendet wird, wenn Datums- und Uhrzeitangaben aus der Datenbank abgerufen werden. Der Standardwert ist: utc. http://guides.rubyonrails.org/configuring.html


Wenn Sie die Rails- Zeitzone ändern möchten , aber weiterhin Active Record in der Datenbank in UTC speichern möchten , verwenden Sie

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

Wenn Sie die Rails- Zeitzone ändern UND Active Record- Speicherzeiten in dieser Zeitzone haben möchten , verwenden Sie

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

Warnung : Sie sollten wirklich zweimal überlegen, sogar dreimal, bevor Sie Zeiten in der Datenbank in einem Nicht-UTC-Format speichern.

Hinweis
Vergessen Sie nicht, Ihren Rails-Server nach dem Ändern neu zu starten application.rb.


Denken Sie daran, dass config.active_record.default_timezonedies nur zwei Werte annehmen kann

  • : local (konvertiert in die in definierte Zeitzone config.time_zone)
  • : utc (konvertiert in UTC)

So finden Sie alle verfügbaren Zeitzonen

rake time:zones:all
Mihai-Andrei Dinculescu
quelle
5
Dies scheint die vollständigste / genaueste Antwort zu sein - @Omnipresent
Aegix
2
Dies sollte die akzeptierte Antwort sein. Es ist vollständiger.
Enrique Moreno Zelt
@ Mihai-AndreiDinculescu Denken Sie, dass es besser ist, die datetimeWerte in UTC in der Datenbank zu speichern und sie dann einfach im Frontend wie mit moment.jsoder zu ändern, was schlagen Sie vor, um diese Daten für jeden Benutzer in der richtigen Zeitzone anzuzeigen?
Alexventuraio
@AlexVentura Ja, Leute, die klüger sind als ich, waren sich vor langer Zeit einig, dass das Speichern von Daten in UTC der beste Weg ist.
Mihai-Andrei Dinculescu
Ja, ich habe es verstanden. Aber was schlagen Sie vor, um in Rails-Ansichten zu implementieren, um die richtigen Werte für jeden Benutzer mit unterschiedlicher Zeitzone anzuzeigen?
Alexventuraio
187

Hinzufügen von Folgendem zu application.rbWerken

 config.time_zone = 'Eastern Time (US & Canada)'
 config.active_record.default_timezone = :local # Or :utc
Allgegenwärtig
quelle
59
Es funktioniert für mich damit:config.time_zone = 'London' config.active_record.default_timezone = :local
Dean Perry
41
Sie können alle Zeitzonen sehen, indem Sie diese in rails c-ActiveSupport::TimeZone.all.map(&:name)
Dean Perry
5
Vielen Dank! Ich hatte auch damit zu kämpfen. Ich habe eine vererbte Legacy-PHP-App, die mit derselben MySQL-Datenbank interagiert und alle Zeiten als lokal speichert. Eine Aktualisierung auf UTC war keine Option. Was ich vorher nicht erreicht hatte, config.time_zone = 'Central Time (US & Canada)' config.active_record.default_timezone = 'Central Time (US & Canada)' aber es auf das lokale Symbol zu setzen, hat den Trick getan.
Matt Hucke
8
Die Schienenführungen sagen, dass config.active_record.default_timezonenur auf :localoder eingestellt werden sollte :utc. Ich gehe davon aus, dass alles andere unerwartete Ergebnisse haben würde.
Kelvin
2
Sie können alle Zeitzonen sehen, indem Sie diese inrake time:zones:all
Orlando
34

Ich kam nach viel Angst zu dem gleichen Schluss wie Dean Perry. config.time_zone = 'Adelaide'und config.active_record.default_timezone = :localwar die Gewinnkombination. Folgendes habe ich während des Prozesses gefunden.

James Barona
quelle
5
Dies ist die richtige Antwort, default_timezone akzeptiert nur: local oder: utc
Francesco Belladonna
20

In meinem Fall (Rails 5) habe ich diese 2 Zeilen in mein hinzugefügt app/config/environments/development.rb

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

Das ist es! Und um sicherzustellen, dass Melbourne korrekt gelesen wurde, habe ich den Befehl in meinem Terminal ausgeführt:

bundle exec rake time:zones:all

und Melbourne war in der Zeitzone gelistet, in der ich bin!

Carole
quelle
Was ist, wenn jeder Benutzer Datums- und Uhrzeitwerte in seiner eigenen Zeitzone sehen soll?
Alexventuraio
@AlexVentura Wenn Sie Ihren Benutzern Datums- und Uhrzeitwerte anzeigen, konvertieren Sie diese in ihre Zeitzonen. Es ist besser, die Datenbankdatensätze dauerhaft zu machen
Waheed
10

Wenn Sie die Zeitzone global auf UTC einstellen möchten, können Sie in Rails 4 Folgendes tun:

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

Stellen Sie sicher, dass Sie Ihre Anwendung neu starten, da sonst die Änderungen nicht angezeigt werden.

sergserg
quelle
3

Gehen Sie auf Schienen 4.2.2 zu application.rbund verwenden Sie config.time_zone='city'(z. B. "London" oder "Bukarest" oder "Amsterdam" usw.).

Es sollte gut funktionieren. Es hat bei mir funktioniert.

Andrei Laslo
quelle
3

Ich musste diesen Block zu meiner environment.rbDatei hinzufügen und alles war gut :)

Rails.application.configure do
    config.time_zone = "Pacific Time (US & Canada)"
    config.active_record.default_timezone = :local
end
  • Ich habe es vor der Zeile hinzugefügtRails.application.initialize!
Taylor A. Leach
quelle
1

Fügen Sie für chinesische Benutzer einfach zwei Zeilen hinzu config/application.rb:

config.active_record.default_timezone = :local
config.time_zone = 'Beijing'
Siwei Shen 申思维
quelle
0

Gehen Sie in Ruby on Rails 6.0.1 zu config > locales > application.rb y agrega lo siguiente:

require_relative 'boot'

require 'rails/all'

# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(*Rails.groups)

module CrudRubyOnRails6
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 6.0

    config.active_record.default_timezone = :local
    config.time_zone = 'Lima'

    # Settings in config/environments/* take precedence over those specified here.
    # Application configuration can go into files in config/initializers
    # -- all .rb files in that directory are automatically loaded after loading
    # the framework and any gems in your application.
  end
end

Sie können sehen, dass ich die Zeitzone mit 2 Zeilen konfiguriere:

config.active_record.default_timezone =: local
config.time_zone = 'Lima'

Ich hoffe, es hilft denen, die mit Ruby on Rails 6.0.1 arbeiten

Juan Castro Lurita
quelle
-2

Wenn Sie die Ortszeit einstellen möchten, fügen Sie den folgenden Text hinzu application.rb

config.time_zone = 'Chennai'

# WARNING: This changes the way times are stored in the database (not recommended)
config.active_record.default_timezone = :local

Starten Sie dann Ihren Server neu

Anand
quelle
12
default_timezone akzeptiert eine von zwei Optionen ..: local oder: utc .. es akzeptiert keine bestimmte Zeitzone, daher funktioniert dies nicht .. Sie müssen default_timezone auf setzen: local
Urkle