Преобразование часового пояса Rails ActiveRecord временных меток - PullRequest
2 голосов
/ 22 апреля 2019

Я расширил класс Time в моих проектах на Rails, чтобы я мог легко получить время в Нью-Йорке:

/ lib / extensions.rb .

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

Супер запутался. Преобразование метки времени в EDT работает, когда я использую in_time_zone в консоли, но не когда я использую расширение? Даже если мой метод расширения работает с объектами времени, которые я создаю в консоли? Что здесь происходит?


( Примечание: Экземпляры времени в Rails фактически являются экземплярами ActiveSupport::TimeWithZone. "Экземпляры TimeWithZone реализуют тот же API, что и экземпляры Ruby Time, так что экземпляры Time и TimeWithZone являются взаимозаменяемыми." - ActiveSupportTimeWithZone )

1 Ответ

1 голос
/ 22 апреля 2019

вам нужно будет исправить 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»)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...