我有三种模式:
class EventInstance
has_many: :conflict_resource_bookings
belongs_to :event_template
end
class ConflictResourceBooking
belongs_to :event_instance
# Cached to simplify data loading:
belongs_to :event_template
end
class EventTemplate
has_many :event_instances
end
当我查询日期时间时,他们通常会回到Time.zone
:
Time.zone = "Pacific Time (US & Canada)"
ConflictResourceBooking.joins(:event_instance).order("event_instances.starts_at").first.event_instance.starts_at
# => Sat, 11 Feb 2017 15:00:00 PST -08:00
EventInstance.all.minimum(:starts_at)
# => Sat, 17 Dec 2016 13:00:00 PST -08:00
但我对一个案例感到惊讶,ActiveRecord的日期时间是UTC,而不是Time.zone
:
Time.zone = "Pacific Time (US & Canada)"
ConflictResourceBooking.joins(:event_instance).minimum("event_instances.starts_at")
# => 2017-02-11 23:00:00 UTC
ConflictResourceBooking.includes(:event_instance).minimum("event_instances.starts_at")
# => 2017-02-11 23:00:00 UTC
# Or, with EventTemplate:
ConflictResourceBooking.joins(:event_template).minimum("event_templates.starts_at")
# => 2017-01-07 23:00:00 UTC
在不同的情况下,joins(...).minimum
的组合会返回本地化的日期时间:
EventInstance.joins(:event_template).minimum("event_templates.starts_at")
# => Sat, 17 Dec 2016 13:00:00 PST -08:00
我想在Time.zone
获得一个日期时间,但我不知道为什么有些人会回来参加UTC。我弄错了吗?
还有什么我可以研究来解释这种差异吗?
我们的应用程序是多租户,用户遍布全球。为了在用户的时区中显示时间,我们在每个请求的开头(Time.zone
挂钩)分配ApplicationController.before_action
。指定的时区来自User
记录,例如Time.zone = current_user.time_zone
。
在上面的示例中,我在rails console
,因此我直接指定了Time.zone
。