Как преобразовать Time.parse (4 октября 1984 г.) в ActiveSupport::TimeWithZone?

Я использую Chronic для анализа времени, и он возвращает эту ошибку:

ArgumentError in EventsController#create 

comparison of Date with ActiveSupport::TimeWithZone failed

Это связано с тем, что начиная с Rails 2.1 база данных и Ruby находятся в разных часовых поясах.

Как я могу преобразовать свое заявление в работу?

def set_dates
  unless self.natural_date.blank? || Chronic.parse(self.natural_date).blank?
    # check if we are dealing with a date or a date + time
    if time_provided?(self.natural_date)
      self.date = nil
      self.time = Chronic.parse(self.natural_date)
    else
      self.date = Chronic.parse(self.natural_date).to_date
      self.time = nil
    end
  end

person Trip    schedule 09.11.2010    source источник


Ответы (2)


Time.zone имеет метод parse, который также возвращает ActiveSupport::TimeWithZone:

>> Time.zone.parse "October 4 1984"
=> Thu, 04 Oct 1984 00:00:00 EDT -04:00

Чтобы поиграть с Chronic, возможно, эта статья может помочь? Если бы вам нужно было, например, исправить метод parse_with_chronic в ActiveSupport::TimeZone, то вы могли бы переписать свой метод:

def set_dates
  unless self.natural_date.blank? || Time.zone.parse_with_chronic(self.natural_date).blank?
    # check if we are dealing with a date or a date + time
    if time_provided?(self.natural_date)
      self.date = nil
      self.time = Time.zone.parse_with_chronic(self.natural_date)
    else
      self.date = Time.zone.parse_with_chronic(self.natural_date).to_date
      self.time = nil
    end
  end
end
person Daniel Vandersluis    schedule 09.11.2010
comment
Верно, но это не очень помогает мне понять, как заставить Chronic.parse(self.natural_date).to_date стать ActiveSupport::TimeWithZone - person Trip; 09.11.2010
comment
Этот патч был на самом деле путь. Я попробовал другой ответ, и он потерпел неудачу после того, как я отметил его правильно. Спасибо ! - person Trip; 09.11.2010

Посмотрите здесь: TimeWithZone имеет конструктор, который принимает обычный объект Time в формате utc и часовой пояс. Итак, учитывая время, вы можете попробовать это:

ActiveSupport::TimeWithZone.new(Chronic.parse(self.natural_date).utc, Time.zone)
person Baju    schedule 09.11.2010
comment
На самом деле это не совсем сработало. Приведенный выше патч, похоже, спас положение. Большое спасибо, Баджу - person Trip; 09.11.2010