转换Rails ActiveRecord时间戳的时区

问题描述 投票:2回答:1

我在Rails项目中扩展了Time类,这样我就可以轻松地在纽约获得时间:

/礼拜/extensions.日本 .

class Time
  # Get NYC time:
  def nyc
    self.in_time_zone('Eastern Time (US & Canada)')
  end
end

测试一下,看起来不错:

time_a = Time.now.utc.nyc
=> Sun, 21 Apr 2019 18:42:12 EDT -04:00

问题是当我从数据库中提取时间戳时:

time_b = object.created_at.in_time_zone('Eastern Time (US & Canada)')
=> Sun, 21 Apr 2019 17:22:04 EDT -04:00
time_c = object.created_at.nyc
=> Sun, 21 Apr 2019 17:22:04 UTC +00:00

超级困惑。当我在控制台中使用in_time_zone时,将时间戳转换为EDT是有效的,但是当我使用扩展时却没有?即使我的扩展方法适用于我在控制台中创建的Time对象?这里发生了什么事?


(注意:Rails中的时间实例实际上是ActiveSupport::TimeWithZone的实例。“TimeWithZone实例实现与Ruby Time实例相同的API,因此Time和TimeWithZone实例是可互换的。” - ActiveSupportTimeWithZone

ruby-on-rails ruby activerecord timezone
1个回答
1
投票

你需要修补ActiveSupport :: TimeWithZone而不是Time,例如

class ActiveSupport::TimeWithZone
  def nyc
    in_time_zone('Eastern Time (US & Canada)')
  end
end

Time.zone.now.nyc # => Mon, 22 Apr 2019 06:44:41 EDT -04:00
User.last.created_at.nyc # => Sun, 21 Apr 2019 13:34:45 EDT -04:00

https://api.rubyonrails.org/classes/ActiveSupport/TimeWithZone.html

(编辑:我之前说过“DateTime”而不是“ActiveSupport :: TimeWithZone”)

© www.soinside.com 2019 - 2024. All rights reserved.