为什么Date.yesterday也算作Date.today呢?

时间:2012-01-05 01:56:23

标签: ruby-on-rails ruby ruby-on-rails-3

我有以下模型和方法:

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(今天)它是零?

P.S。我正在使用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 个答案:

答案 0 :(得分:11)

这是因为calculate.rb正在为配置的时区调用Date类的“当前”方法(默认为UTC)。

如果您打开rails控制台,您可以通过以下方式查看“Date.yesterday”计算的日期:

Time.zone.today

这可能会告诉你明天的约会。所以今天看到今天铁路看到的Date.yesterday。 ;)

您可以通过以下方式更直接地使用日期库:

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

这会给你昨天的日期,就像你期望的那样,而active_support正在返回:

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

答案 1 :(得分:0)

如果您使用Time课程,则可以访问UTC(或“zulu”)时区,而不是使用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