Как изменить часовой пояс объекта TimeWithZone? - PullRequest
1 голос
/ 09 марта 2010

У меня есть модель Coupon с атрибутом expired_at, класса DateTime, и перед тем, как сохранить запись, я хочу изменить часть поля в соответствии с выбором пользователя. Скажем,

c = Coupon.new
c.expired_at = DateTime.now
c.expired_at_timezone = "Arizona"
c.save!

А в coupon.rb:

class Coupon < ActiveRecord::Base
  def before_save
    # change the zone part here, leave the date and time part alone
  end
end

Я хочу сказать, что если администратор хочет, чтобы срок действия купона истек в 2014-07-01 10:00 am по времени Аризоны, expired_at, хранящийся в БД, должен выглядеть примерно так:

Tue, 01 Jul 2014 10:00:00 MST -07:00

Можно ли каким-либо образом изменить только часть зоны и оставить часть даты и времени в покое?

Спасибо

Ответы [ 2 ]

0 голосов
/ 09 марта 2010

Вы можете изменить часовой пояс по умолчанию для вашего приложения rails, изменив config.time_zone в вашем environment.rb. Обычно по умолчанию это UTC.

В вашем случае каждый купон имеет свой часовой пояс. Таким образом, вы должны использовать другой подход. Вам не нужно менять логику save. Вам просто нужно изменить ваш поиск логика. Используйте метод in_time_zone класса Time.

c =  Coupon.last
p c.expired_at.in_time_zone(c.expired_at_timezone)
# => Tue, 09 Mar 2010 02:06:00 MST -07:00

В противном случае вы можете переопределить expired_at метод вашей модели купона.

def expired_at
  # access the current value of expired_at from attributes hash
  attributes["expired_at"].in_time_zone(self.expired_at_timezone)
end

Теперь вы можете делать следующее:

p Coupon.last.expired_at
# => Tue, 09 Mar 2010 02:06:00 MST -07:00
0 голосов
/ 09 марта 2010

Лучше сохранить всю свою дату в UTC после того, как вы сможете сравнить по TimeZone.

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