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

问题描述 投票:0回答:11

在我的

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
到达美国东部时间。 但是,当在数据库中创建记录时,看起来
datetime
仍以 UTC 格式存储。

在上面的评论中,他们说

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

我该如何做,在哪里做?

另外,我也会将其部署在 Heroku 上,并且我希望保留该设置

ruby-on-rails ruby timezone rails-activerecord
11个回答
252
投票

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

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


如果您想更改 Rails 时区,但继续将 Active RecordUTC 保存在数据库中,请使用

# 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
只能采用两个值

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

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

rake time:zones:all

199
投票

将以下内容添加到

application.rb
有效

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

34
投票

经过一番痛苦之后,我得出了与迪恩·佩里(Dean Perry)相同的结论。

config.time_zone = 'Adelaide'
config.active_record.default_timezone = :local
是获胜组合。 这是我在这个过程中发现的


25
投票

就我而言(Rails 5),我最终在我的

app/config/environments/development.rb

中添加了这两行
config.time_zone = "Melbourne"
config.active_record.default_timezone = :local

就是这样!为了确保正确读取 Melbourne,我在终端中运行了命令:

bundle exec rake time:zones:all

墨尔本在我所在的时区中!


12
投票

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

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

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


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

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

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

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


4
投票

我必须将此块添加到我的

environment.rb
文件中,一切都很好:)

Rails.application.configure do
    config.time_zone = "Pacific Time (US & Canada)"
    config.active_record.default_timezone = :local
end
  • 我在之前添加了它
    Rails.application.initialize!

3
投票

在轨道 4.2.2 上,转到

application.rb
并使用
config.time_zone='city'
(例如:“伦敦”或“布加勒斯特”或“阿姆斯特丹”等)。

它应该工作得很好。这对我有用。


1
投票

对于中国用户,只需添加下面两行即可

config/application.rb
:

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

0
投票

特别将其添加到您的环境文件中,例如:

Production.rb

时区设置
  config.time_zone = 'Asia/Dubai'

-2
投票

如果要设置当地时间,请在

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

然后重新启动服务器

© www.soinside.com 2019 - 2024. All rights reserved.