Как преобразовать Time.parse («4 октября 1984 года») в ActiveSupport :: TimeWithZone? - PullRequest
1 голос
/ 09 ноября 2010

Я использую 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

Ответы [ 2 ]

1 голос
/ 09 ноября 2010

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

ActiveSupport::TimeWithZone.new(Chronic.parse(self.natural_date).utc, Time.zone)
1 голос
/ 09 ноября 2010

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
...