我似乎无法在我的Rails 5应用程序中使用skip_time_zone_conversion_for_attributes或active_record.time_zone_aware_attributes
在我的application.rb我有
config.active_record.default_timezone = :local
config.active_record.time_zone_aware_attributes = false
在我的模型中,我有
self.skip_time_zone_conversion_for_attributes = [:start_date, :end_date]
然而,当统计日期和结束日期作为JSON发送回客户端时,它们总是被转换为客户端时区。我不希望这样,因为我需要向客户端显示服务器时间。
为什么这不起作用?我是否需要执行其他操作以确保模型中的start_date和end_date不会转换为用户时区?
谢谢
这是因为铁轨有几处陷阱。最重要的是因为Time.now和Time.current是完全不同的东西。
config.time_zone = 'Berlin' # Your local time zone
config.active_record.default_timezone = :local
config.active_record.time_zone_aware_attributes = false
这是application.rb中存在的字段,可以使所有模型的时间相关属性生效。
例如 - 如果您没有提及任何time_zone,那么默认情况下它将采用'UTC'
post = Post.create
post.created_at # => Mon, 22 Apr 2019 06:43:08 UTC +00:00
Time.current # => Mon, 22 Apr 2019 06:43:35 UTC +00:00
Time.now # => 2019-04-22 12:13:40 +0530
在您的数据库中,Time.current显示“UTC”格式,但Time.now正在选择您当地的时区。
现在,如果你改变time_zone,
config.time_zone = 'Berlin'
然后,
post = Post.create
post.created_at # => Mon, 22 Apr 2019 08:45:48 CEST +02:00
Time.current # => Mon, 22 Apr 2019 08:46:05 CEST +02:00
Time.now # => 2019-04-22 12:16:00 +0530
现在在您的数据库中,created_at值以“UTC”时区存储,但是当您检索该字段时,它以set time_zone格式显示在'Berlin'中。但是你的Time.now仍然在你当地的时区。
现在按照你的问题我使用skip_time_zone_conversion_for_attributes,并用time_zone改变我的模型是'柏林'
class Post < ActiveRecord::Base
self.skip_time_zone_conversion_for_attributes = [:created_at]
end
然后,
post = Post.create
post.created_at # => 2019-04-22 06:56:31 UTC
Time.current # => Mon, 22 Apr 2019 08:56:53 CEST +02:00
Time.now # => 2019-04-22 12:26:46 +0530
根据skip_time_zone_conversion_for_attributes方法,跳过这些属性,当我重试属性时 - created_at它以'UTC'格式显示它而不是我的set time_zone'Berlin',按预期工作。
因此,在将其设置为JSON之前,这可能有助于您理解和检查您的设置。
有关更多信息,请参阅此链接 - https://api.rubyonrails.org/classes/ActiveRecord/Timestamp.html
https://makandracards.com/makandra/46009-working-with-or-without-time-zones-in-rails-applications