0

如何为 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

是否有解决方案可以阻止我更改所有呈现时间的地方?

4

2 回答 2

1

只需尝试仅在application.rb中使用以下给出的一个,

config.active_record.default_timezone = :local

丢弃,

config.time_zone

愿这对你有所帮助。

于 2013-10-31T12:27:15.200 回答
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 并且不费心重置它,它可能会泄漏给其他用户。

我建议你先试试这个,看看它是否能达到你想要的效果,然后再试着理解这一切意味着什么,因为这会让你头晕目眩。不过,如果您有兴趣,我很乐意解释更多关于如何以及为什么。

于 2013-10-31T21:51:20.920 回答