如何为 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
有没有解决方案可以阻止我更改所有渲染时间的位置?
只需尝试仅在application.rb中使用下面给定的那个,
config.active_record.default_timezone = :local
丢弃
config.time_zone
愿这对你有帮助。
首先:我总是支持不弄乱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 并且懒得重置它,它可能会泄漏给其他用户。
我建议你尝试一下,看看它是否做了你想要的,然后再试图理解这一切意味着什么,因为这会让你头晕目眩。不过,如果您有兴趣,我很乐意解释更多关于如何以及为什么