Как изменить часовой пояс по умолчанию для Active Record в Rails?

В моем 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, и я бы хотел, чтобы настройка была перенесена


person Omnipresent    schedule 25.05.2011    source источник
comment
В MySQL datetime - это тип без часового пояса. Т.е. он может быть в любом часовом поясе. Если вы относитесь к этому как к UTC, это нормально. Но будьте осторожны, если кто-то смотрит прямо в вашу базу данных и интерпретирует ее по-другому.   -  person Vanuan    schedule 04.05.2016


Ответы (10)


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

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
person Mihai Dinculescu    schedule 26.08.2015
comment
Это кажется наиболее полным / точным ответом - @Omnipresent - person Aegix; 30.10.2015
comment
Это должен быть принятый ответ. Это более полно. - person Enrique Moreno Tent; 02.03.2016
comment
@ Mihai-AndreiDinculescu Считаете ли вы, что лучше сохранить значения datetime в UTC в базе данных, а затем просто изменить их в интерфейсе, например, с помощью _ 2_ или что вы предлагаете для отображения этих данных в правильном часовом поясе для любого пользователя? - person alexventuraio; 11.11.2016
comment
@AlexVentura Да, люди умнее меня давным-давно согласились, что лучше всего хранить даты в формате UTC. - person Mihai Dinculescu; 11.11.2016
comment
Да, я получил его. Но что вы предлагаете реализовать в представлениях rails, чтобы отображать правильные значения для любого пользователя с другим часовым поясом? - person alexventuraio; 11.11.2016
comment
@AlexVentura Вы не можете этого сделать, если не заставите их сказать вам часовой пояс своей машины. С небольшим JavaScript это не должно быть сложно. Предполагая, что этот javascript дает вам секунды +/- UTC (например, 3600 - +1 час), вы можете использовать его в фильтре контроллера before следующим образом: Time.zone = Time.find_zone! params.fetch(:utc_offset) - person Adamantish; 16.02.2017
comment
Может быть проще просто использовать moment.js, поскольку необходим javascript. - person Adamantish; 16.02.2017

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

 config.time_zone = 'Eastern Time (US & Canada)'
 config.active_record.default_timezone = :local # Or :utc
person Omnipresent    schedule 25.05.2011
comment
У меня работает вот так: config.time_zone = 'London' config.active_record.default_timezone = :local - person ; 08.05.2012
comment
Вы можете увидеть все часовые пояса, запустив это в rails c - ActiveSupport::TimeZone.all.map(&:name) - person ; 08.05.2012
comment
Большое спасибо! Я тоже боролся с этим. У меня есть унаследованное устаревшее приложение PHP, которое взаимодействует с той же базой данных mysql и все время сохраняет как локальное; обновить его для использования UTC было невозможно. Раньше я ничего не добился: config.time_zone = 'Central Time (US & Canada)' config.active_record.default_timezone = 'Central Time (US & Canada)', но установка символа: local сделала свое дело. - person Matt Hucke; 31.07.2012
comment
Использование config.active_record.default_timezone = :local без установки config.time_zone у меня сработало. - person Michael Stalker; 26.09.2012
comment
В направляющих указано, что config.active_record.default_timezone следует устанавливать только на :local или :utc. Я предполагаю, что все остальное приведет к неожиданным результатам. - person Kelvin; 13.03.2013
comment
@DeanPerry Вы должны дать отдельный ответ своими комментариями! - person gotqn; 21.04.2013
comment
Вы можете увидеть все часовые пояса, запустив это в rake time:zones:all - person Orlando; 07.08.2013
comment
default_timezone ТОЛЬКО accept: local или: utc .. все остальное не будет работать .. Да, он довольно ограничен в функциональности, и имя var на самом деле не так хорошо отображает. - person Urkle; 12.08.2013
comment
config.active_record.default_timezone устарел после Rails 3.2.13 и вызывает проблемы при использовании в сочетании с delayed_job. См .: stackoverflow.com/questions/22189490/ - person joseph.hainline; 06.03.2014
comment
Решение Дина Перри сработало для меня с использованием рельсов 3.2.14 - person tungsten_carbide; 18.04.2014
comment
Просмотреть все доступные часовые пояса с rake:time:all - person Nino van Hooff; 26.06.2015
comment
Не забудьте перезагрузить сервер после того, как добавите эти строки кодов. - person cyonder; 30.09.2015
comment
Просмотреть все доступные часовые пояса с rake time:zones в Rails 5. - person traday; 05.09.2017

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

person James Barona    schedule 26.08.2012
comment
Это правильный ответ, default_timezone принимает только: local или: utc - person Francesco Belladonna; 20.01.2014

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

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

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

bundle exec rake time:zones:all

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

person Carole    schedule 27.10.2016
comment
Что, если я хочу, чтобы каждый пользователь видел значения даты и времени в своем часовом поясе? - person alexventuraio; 11.11.2016
comment
@AlexVentura, когда вы показываете значения даты и времени своим пользователям, конвертируйте их в их часовые пояса. Лучше сделать записи базы данных постоянными - person Waheed; 04.03.2019

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

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

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

person sergserg    schedule 05.08.2014

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

Он должен работать нормально. У меня это сработало.

person Andrei Laslo    schedule 02.09.2015

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

Rails.application.configure do
    config.time_zone = "Pacific Time (US & Canada)"
    config.active_record.default_timezone = :local
end
  • Я добавил это перед строкой Rails.application.initialize!
person Taylor A. Leach    schedule 16.01.2018

В Ruby on Rails 6.0.1 перейдите в config> locales> application.rb и согласитесь на 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

Вы можете видеть, что я настраиваю часовой пояс с помощью двух строк:

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

Надеюсь, это поможет тем, кто работает с Ruby on Rails 6.0.1.

person Juan Castro Lurita    schedule 28.11.2019

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

config.active_record.default_timezone = :local
config.time_zone = 'Beijing'
person Siwei    schedule 08.08.2017

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

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

person Anand    schedule 07.08.2013
comment
default_timezone принимает один из двух вариантов ..: local или: utc .. он не принимает определенный часовой пояс, поэтому это не сработает .. вам нужно установить default_timezone на: local - person Urkle; 12.08.2013