我在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)
你需要修补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”)