Как изменить часовой пояс по умолчанию для Active Record в Rails? - PullRequest
124 голосов
/ 25 мая 2011

В моем application.rb я наткнулся на следующий комментарий

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

Как вы видите сверху, я сделал config.time_zone к EST времени. Тем не менее, когда записи создаются в БД, похоже, что datetime сохраняется в формате UTC.

В приведенном выше комментарии они говорят,

... и сделать Active Record автоматически преобразованным в эту зону ...

Как я могу это сделать и где?

Кроме того, я также разверну это на heroku, и мне бы хотелось, чтобы установка перенесла

Ответы [ 9 ]

174 голосов
/ 25 мая 2011

добавление следующих к application.rb работ

 config.time_zone = 'Eastern Time (US & Canada)'
 config.active_record.default_timezone = :local # Or :utc
164 голосов
/ 26 августа 2015

Я решил скомпилировать этот ответ, потому что все остальные, по-видимому, являются неполными.

config.active_record.default_timezone определяет, использовать ли Time.local (если установлено:local) или Time.utc (если установлено значение: utc) при извлечении даты и времени из базы данных.Значение по умолчанию: utc.http://guides.rubyonrails.org/configuring.html


Если вы хотите изменить Rails часовой пояс, но продолжать сохранять Active Record в базе данных в UTC, используйте

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

Если вы хотите изменить Rails часовой пояс И иметь Active Record время хранения в этомчасовой пояс, используйте

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

Предупреждение : вам действительно следует подумать дважды, даже трижды, прежде чем сохранять время в базе данных в формате, отличном от UTC.

Примечание
Не забудьте перезапустить сервер Rails после изменения application.rb.


Помните, что config.active_record.default_timezone может принимать только два значения

  • : местный (конвертируется в часовой пояс, определенный в config.time_zone)
  • : utc (конвертируется в UTC)

Вот как вы можете найти все доступные часовые пояса

rake time:zones:all
34 голосов
/ 26 августа 2012

Я пришел к тому же выводу, что и Дин Перри, после долгих страданий.config.time_zone = 'Adelaide' и config.active_record.default_timezone = :local были выигрышной комбинацией.Вот что я нашел во время процесса.

20 голосов
/ 28 октября 2016

В моем случае (Rails 5) я добавил эти 2 строки в мои app/config/environments/development.rb

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

Вот и все!И чтобы убедиться, что Мельбурн прочитан правильно, я запустил команду в своем терминале:

bundle exec rake time:zones:all

, и Мельбурн перечислил в часовом поясе, в котором я нахожусь!

9 голосов
/ 05 августа 2014

Если вы хотите глобально установить часовой пояс UTC, вы можете сделать следующее в Rails 4:

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

Обязательно перезапустите приложение, иначе вы не увидите изменений.

3 голосов
/ 02 сентября 2015

На рельсах 4.2.2 перейдите на application.rb и используйте config.time_zone='city' (например: "Лондон" или "Бухарест" или "Амстердам" и т. Д.)

Это должно работать просто отлично. У меня это сработало.

2 голосов
/ 16 января 2018

Мне пришлось добавить этот блок в мой environment.rb файл, и все было хорошо:)

Rails.application.configure do
    config.time_zone = "Pacific Time (US & Canada)"
    config.active_record.default_timezone = :local
end
  • Я добавил его до строки Rails.application.initialize!
0 голосов
/ 08 августа 2017

для китайского пользователя, просто добавьте две строки ниже config/application.rb:

config.active_record.default_timezone = :local
config.time_zone = 'Beijing'
0 голосов
/ 07 августа 2013

Если вы хотите установить местное время, добавьте следующий текст в 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

Затем перезагрузите сервер

...