Rails:如何为整个应用程序将默认时区设置为特定的时区?

时间:2013-10-31 12:02:06

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord timezone

如何为Rails和ActiveRecord设置默认时区?我有很多地方可以显示时间(例如在数据库中创建一些实例等)。时间显示在我当前的时区中。我应该以某种方式配置我在托管平台上使用的Rails / ActiveRecord或* nix分配?

我已经尝试将其添加到application.rb文件而没有任何结果:

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

我也尝试过使用

config.time_zone = 'Moscow'
config.active_record.default_timezone = "Moscow"

但在那种情况下我会收到警告

warning: :database_timezone option must be :utc or :local - defaulting to :local

是否有一种解决方案可以阻止我改变那些时间呈现的地方?

2 个答案:

答案 0 :(得分:1)

只需在 application.rb

中尝试使用下面给出的一个
config.active_record.default_timezone = :local

丢弃,

config.time_zone

可以帮助你。

答案 1 :(得分:0)

首先:我总是没有弄乱AR存储时间戳的方式,因为Rails已经为你做了关于时间转换的所有魔力。

我假设您要在当前用户选择的时区中显示应用中的时间(或者您已经以其他方式确定了每个用户)。在这种情况下,您在config.time_zone中配置的内容无关紧要,因为您显然想要覆盖它。 Rails有一个简洁的机制,称为Time.use_zone

之前我在around_filter中使用过,就像这样:

around_filter :set_time_zone

def set_time_zone
  Time.use_zone(current_user.try(:time_zone) || Time.zone) do
    yield
  end
end

如果该用户存在,则将当前请求的时区设置为current_user的time_zone。否则回落到application.rb中配置的时区。

Time.use_zone区块内,所有时间都会显示并保存在该区域中。

这种方法非常方便,每次请求后,时区都会重置为配置的内容。如果您只是更改Time.zone并且不打算重置它,它可能会泄漏给其他用户。

我建议你尝试一下,看看它是否能达到你想要的效果,然后再试着将这一切包裹起来,因为这样可以让你头晕目眩。如果你有兴趣的话,我很乐意解释更多关于如何以及为什么的原因。

相关问题