为什么ActiveRecord会在这种情况下返回UTC日期时间?

时间:2017-03-02 21:24:19

标签: ruby-on-rails datetime activerecord activerecord-calculations

我有三种模式:

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

我们的应用程序是多租户,用户遍布全球。为了在用户的时区中显示时间,我们在每个请求的开头(Time.zone挂钩)分配ApplicationController.before_action。指定的时区来自User记录,例如Time.zone = current_user.time_zone

在上面的示例中,我在rails console,因此我直接指定了Time.zone

0 个答案:

没有答案