Come modificare il fuso orario predefinito per Active Record in Rails?

Nel mio application.rb mi sono imbattuto nel seguente commento

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

Come vedi sopra, ho fatto config.time_zone all’ora EST. Tuttavia, ancora quando i record vengono creati nel DB, sembra che il datetime venga archiviato in formato UTC.

Nel commento sopra, dicono

… e convertire Active Record automaticamente in questa zona …

Come posso farlo e dove?

Inoltre, distribuirò questo anche su heroku e mi piacerebbe che l’ambientazione continuasse

aggiungendo in seguito a application.rb funziona

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

Ho deciso di compilare questa risposta perché tutti gli altri sembrano incompleti.

config.active_record.default_timezone determina se utilizzare Time.local (se impostato su: local) o Time.utc (se impostato su: utc) quando si estraggono date e ore dal database. L’impostazione predefinita è: utc. http://guides.rubyonrails.org/configuring.html


Se si desidera modificare il fuso orario Rails , ma continuare ad avere il record attivo salvato nel database in UTC , utilizzare

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

Se si desidera modificare il fuso orario Rails e avere tempi di archivio Active Record in questo fuso orario, utilizzare

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

Attenzione : dovresti pensarci due volte, anche tre volte, prima di salvare i tempi nel database in un formato non UTC.

Nota
Non dimenticare di riavviare il server Rails dopo aver modificato application.rb .


Ricorda che config.active_record.default_timezone può richiedere solo due valori

  • : local (converte nel fuso orario definito in config.time_zone )
  • : utc (converte in UTC)

Ecco come puoi trovare tutti i fusi orari disponibili

 rake time:zones:all 

Sono arrivato alla stessa conclusione di Dean Perry dopo molte angosce. config.time_zone = 'Adelaide' e config.active_record.default_timezone = :local era la combinazione vincente. Ecco cosa ho trovato durante il processo.

Nel mio caso (Rails 5), ho finito per aggiungere queste 2 righe nella mia app/config/environments/development.rb

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

Questo è tutto! E per assicurarmi che Melbourne venisse letto correttamente, ho eseguito il comando nel mio terminale:

bundle exec rake time:zones:all

e Melbourne è stata inserita nel fuso orario in cui mi trovo!

Se si desidera impostare il fuso orario su UTC a livello globale, è ansible eseguire quanto segue in Rails 4:

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

Assicurati di riavviare la tua applicazione o non vedrai le modifiche.

Su rails 4.2.2, vai su application.rb e usa config.time_zone='city' (es .: ‘London’ o ‘Bucharest’ o ‘Amsterdam’ e così via).

Dovrebbe funzionare bene. Ha funzionato per me.

Ho dovuto aggiungere questo blocco al mio file environment.rb e tutto andava bene 🙂

 Rails.application.configure do config.time_zone = "Pacific Time (US & Canada)" config.active_record.default_timezone = :local end 
  • L’ho aggiunto prima della riga Rails.application.initialize!

per utenti cinesi, aggiungi solo due righe sotto a config/application.rb :

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

Se si desidera impostare l’ora locale, aggiungere il seguente testo in application.rb

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

Quindi riavvia il tuo server