Почему Date.yesterday также считается Date.today? - PullRequest
10 голосов
/ 05 января 2012

У меня есть следующая модель и методы:

class UserPrice < ActiveRecord::Base
  attr_accessible :price,  :purchase_date,    

  def self.today
    where(:purchase_date => Date.today)
  end

  def self.yesterday
    where(:purchase_date => Date.yesterday)
  end

Почему в моей форме, если я даю свое поле date_select :purchase_date 1/4/2012 (метод yesterday), оно также считается как сегодня (today метод), и если я дам его 1/5/2012 (сегодня), это ноль?

PS Я использую Rails 3.0.10 с PostgreSQL.


Обновление

Это моя консоль возвращает:

$ rails console --s
Loading development environment in sandbox (Rails 3.0.10)
Any modifications you make will be rolled back on exit
irb(main):001:0> Date.today
=> Wed, 04 Jan 2012
irb(main):002:0> Time.now
=> 2012-01-04 21:28:07 -0500
irb(main):003:0> Time.zone.now
=> Thu, 05 Jan 2012 02:28:18 UTC +00:00
irb(main):004:0> Date.yesterday
=> Wed, 04 Jan 2012
irb(main):005:0>

Теперь yesterday облажался, не имеет смысла ....

Ответы [ 2 ]

11 голосов
/ 05 января 2012

Это происходит потому, что computing.rb вызывает «текущий» метод класса Date для настроенного часового пояса (по умолчанию - UTC).

Если вы откроете консоль rails, вы увидите дату, когда"Date.yesterday" рассчитывается следующим образом:

Time.zone.today

Это, вероятно, покажет вам дату завтрашнего дня.Так что Date.yesterday для того, что рельсы видят как сегодня, сегодня.;)

Вы можете работать с библиотекой дат более напрямую, выполнив:

Date.today.advance(:days => -1)

Это даст вам вчерашнюю дату, как вы ожидаете, тогда как active_support возвращает:

Date.current.advance(:days => -1) 
0 голосов
/ 16 января 2014

Если вы используете класс Time, у вас будет доступ к часовому поясу UTC (или "зулу") вместо использования часового пояса среды в Date классе.

class UserPrice < ActiveRecord::Base
  attr_accessible :price,  :purchase_date,    

  def self.today
    where(purchase_date: today_utc_date)
  end

  def self.yesterday
    where(purchase_date: today_utc_date.yesterday)
  end

  private

  def today_utc_date
    @today ||= Time.zone.today
  end
end

Также, если вам нужно обработать внешнюю дату, например, params[:purchase_date]:

Time.parse(params[:purchase_date]).utc.to_date
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...