如何在Rails中更改Active Record的默认时区?

Omn*_*ent 130 ruby timezone ruby-on-rails rails-activerecord

在我看来,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)'
Run Code Online (Sandbox Code Playgroud)

从上面看,我已经config.time_zone到了EST时间.但是,仍然在DB中创建记录时,它看起来像是datetime以UTC格式存储.

他们说,在上面的评论中

...并使Active Record自动转换为此区域...

我怎么能这样做,在哪里?

此外,我将在heroku上部署这个,我希望设置继续

Omn*_*ent 181

添加以下application.rb作品

 config.time_zone = 'Eastern Time (US & Canada)'
 config.active_record.default_timezone = :local # Or :utc
Run Code Online (Sandbox Code Playgroud)

  • 这对我有用:`config.time_zone ='London'``config.active_record.default_timezone =:local` (58认同)
  • 您可以通过在`rails c` - ActiveSupport :: TimeZone.all.map(&:name)中运行它来查看所有时区. (37认同)
  • rails指南说`config.active_record.default_timezone`应该只设置为`:local`或`:utc`.我认为其他任何事情都会有意想不到的结果. (8认同)
  • 在Rails 3.2中,这似乎与我无关 (5认同)
  • 非常感谢!我也一直在努力解决这个问题.我有一个继承的遗留PHP应用程序,它与同一个mysql数据库交互,并且所有时间都存储为本地; 更新它以使用UTC不是一个选项.我以前没有做过什么:`config.time_zone ='中部时间(美国和加拿大)'``config.active_record.default_timezone ='中部时间(美国和加拿大)'`但是将它设置为:本地符号就可以了. (5认同)
  • 您可以通过在 `rake time:zones:all` 中运行它来查看所有时区 (2认同)

Mih*_*scu 173

我已经决定编译这个答案,因为所有其他答案似乎都不完整.

config.active_record.default_timezone确定从数据库中提取日期和时间时是否使用Time.local(如果设置为:local)或Time.utc(如果设置为:utc).默认值为:utc. http://guides.rubyonrails.org/configuring.html


如果要更改Rails时区,但继续在UTC中保存数据库中的Active Record,请使用

# application.rb
config.time_zone = 'Eastern Time (US & Canada)'
Run Code Online (Sandbox Code Playgroud)

如果你想改变Rails的时区活动记录储存时间在该时区,使用

# application.rb
config.time_zone = 'Eastern Time (US & Canada)'
config.active_record.default_timezone = :local
Run Code Online (Sandbox Code Playgroud)

警告:在以非UTC格式在数据库中保存时间之前,您确实应该三思而后行,甚至三次.

注意
修改后不要忘记重新启动Rails服务器application.rb.


请记住,config.active_record.default_timezone只能采用两个值

  • :local(转换为定义的时区config.time_zone)
  • :utc(转换为UTC)

以下是您可以找到所有可用时区的方法

rake time:zones:all
Run Code Online (Sandbox Code Playgroud)

  • 这似乎是最完整/准确的答案 - @Omnipresent (4认同)
  • 这应该是公认的答案.它更完整. (2认同)

小智 34

经过多次痛苦,我得到了与佩里院长相同的结论. config.time_zone = 'Adelaide'并且config.active_record.default_timezone = :local是获胜的组合.这是我在这个过程中发现的.

  • 这是正确的答案,default_timezone仅接受:local或:utc (5认同)

小智 20

在我的情况下(Rails 5),我最终添加了这两行 app/config/environments/development.rb

config.time_zone = "Melbourne"
config.active_record.default_timezone = :local
Run Code Online (Sandbox Code Playgroud)

而已!为了确保正确读取墨尔本,我在终端中运行了命令:

bundle exec rake time:zones:all

墨尔本在我所在的时区上市!


ser*_*erg 10

如果要将时区全局设置为UTC,可以在Rails 4中执行以下操作:

# Inside config/application.rb
config.time_zone = "UTC"
config.active_record.default_timezone = :utc
Run Code Online (Sandbox Code Playgroud)

请务必重新启动您的应用程序,否则您将看不到更改.


Jua*_*ita 5

在 Ruby on Rails 6.0.1 中,转到config > locales > application.rb并添加以下内容:

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
Run Code Online (Sandbox Code Playgroud)

你可以看到我用两行配置时区:

config.active_record.default_timezone =: local
config.time_zone = 'Lima'
Run Code Online (Sandbox Code Playgroud)

我希望它对那些使用 Ruby on Rails 6.0.1 的人有所帮助