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


140

在我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上部署它,我希望设置可以继续使用


在MySQL中,datetime是一种无时区的类型。即可以在您想要的任何时区。如果您将其视为UTC,那很好。但是要当心,如果有人直接查看您的数据库并以不同的方式解释它。
Vanuan

Answers:


199

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

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的时区活动记录在这个时区,使用储存时间

# 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

5
这似乎是最完整/准确的答案-@Omnipresent
Aegix 2015年

2
这应该是公认的答案。它比较完整。
Enrique Moreno Tent

@ Mihai-AndreiDinculescu您是否认为最好将UTC中的datetime值存储在数据库中,然后像在那样更改前端中的值,或建议使用什么,以便在任何用户的正确时区中显示此数据?moment.js
alexventuraio '16

@AlexVentura是的,比我聪明的人早就同意将日期存储在UTC中是最好的方法。
Mihai-Andrei Dinculescu

是的,我明白了。但是,您建议在Rails视图中实现什么以显示具有不同时区的任何用户的正确值?
alexventuraio

187

application.rb作品中添加以下内容

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

59
它正在为我工​​作:config.time_zone = 'London' config.active_record.default_timezone = :local
Dean Perry

41
您可以通过在运行此看到所有的时区rails c-ActiveSupport::TimeZone.all.map(&:name)
迪恩佩里

5
非常感谢!我也一直为此苦苦挣扎。我有一个继承的旧版PHP应用程序,可与同一个mysql数据库进行交互并将所有时间存储为本地。不能将其更新为使用UTC。我以前什么都没做: config.time_zone = 'Central Time (US & Canada)' config.active_record.default_timezone = 'Central Time (US & Canada)' 但是把它设置为:local符号就可以了。
马特·赫克

8
rails指南说config.active_record.default_timezone应该仅将其设置为:local:utc。我认为其他任何事情都会带来意想不到的结果。
开尔文2013年

2
您可以通过在rake time:zones:all
Orlando

34

在经历了很多痛苦之后,我得出了与Dean Perry相同的结论。 config.time_zone = 'Adelaide'并且config.active_record.default_timezone = :local是获胜的组合。这是我在此过程中发现的。


5
这是正确的答案,default_timezone仅接受:local或:utc
Francesco Belladonna 2014年

20

就我而言(第5条),我最终将这2行添加到了 app/config/environments/development.rb

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

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

bundle exec rake time:zones:all

墨尔本正在列出我所在的时区!


如果我希望每个用户在自己的时区中看到日期时间值怎么办?
alexventuraio '16

@AlexVentura当您向用户显示日期时间值时,请将其转换为他们的时区。使数据库记录持久化是一种更好的做法
Waheed19年

10

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

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

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


3

在轨道4.2.2上,前往application.rb并使用config.time_zone='city'(例如:“伦敦”或“布加勒斯特”或“阿姆斯特丹”等)。

它应该工作正常。它为我工作。


3

我不得不将此块添加到我的environment.rb文件中,一切都很好:)

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

1

对于中国用户,只需在下面添加两行即可config/application.rb

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

0

在Ruby on Rails 6.0.1中,转到config > locales > application.rb和agrega lo 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

您可以看到我正在用2行配置时区:

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

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


-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

然后重新启动服务器


12
default_timezone接受以下两个选项之一:.local::local或:utc ..它不接受特定时区,因此将不起作用。.您需要将default_timezone设置为:local
Urkle 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.